トップページ⇒tech
1001コメント302KB

C++相談室 part13

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの引き篭もり NGNG
怪しい仕様は細々ありますが大丈夫です!
elegantなソースを目指してね。

( ^-゚).。o(きっと関連URLは >>2-5 辺りだよ)
0655デフォルトの名無しさんNGNG
>>654
是非マイクロソフトさんにも言ってあげてください。
0656デフォルトの名無しさんNGNG
>654
> TSomeType& Parameter();
それだと問題が全く解決しないと思うが…。プロパティ化したいメンバ変数が一つなら
良いけど、複数あったら NG だよね。

現実的な解としては、マクロ使うのが比較的マシな回答だと思う。他に Loki の Tuple
を使うって手もあるが、あまりお奨めはせん。
0657デフォルトの名無しさんNGNG
こんなんどうよ。

// property.h
template<class T, class O, T O::*M>
class property {
  O &obj;
 public:
  property(O &o) : obj(o) {}
  property& operator=(const T& x) {obj.*M = x; return *this;}
  operator const T&() const {return obj.*M;}
  operator T&() {return obj.*M;}
};
0658デフォルトの名無しさんNGNG
// proptest.c
#include <iostream>
#include "property.h"

class foo
{
  int a;
 public:
  property<int, foo, &foo::a> x;
  foo() : a(0), x(*this) {};
  friend ostream& operator<<(ostream &os, const foo &f) {
    return os << "foo<" << f.x << ">";
  }
};

int main()
{
  foo f;
  cout << f << endl;
  f.x = 10;
  cout << f << endl;
}
0659デフォルトの名無しさんNGNG
>>658
それ漏れも考えて書こうと思ったけどやめた。

値の範囲チェックとかどうすんのよ?
0660デフォルトの名無しさんNGNG
>>657
しかもそれだけでいいのなら
template<class T>
class property {
  T obj;
 public:
  property() : obj(T()) {}
  property& operator=(const T& x) {obj = x; return *this;}
  operator const T&() const {return obj;}
  operator T&() {return obj;}
};
でいいんじゃないか?
0661デフォルトの名無しさんNGNG
>>659
これじゃダメ?

class foo
{
  int a;
  class prop1 : public property<int, foo, &foo::a> {
    typedef property<int, foo, &foo::a> super;
    prop1& operator=(int s) { if (s < 0) s = 0; super::operator=(x); return *this;}
  };
  prop1 x;
}
0662デフォルトの名無しさんNGNG
>>660
だな。
0663デフォルトの名無しさんNGNG
>>660
それだけでいいのなら
property<T> の代わりに T でいいんじゃないか?

#include <boost/bind.hpp>
#include <boost/function.hpp>

template<typename T>
class property {
 boost::function<T> getterFunc;
 boost::function<void, const T&> setterFunc;
public:
 template<typename Owner, typename G>
 property( Owner& p, G g )
  : getterFunc( boost::bind( g, p ) ) {}
 template<typename Owner, typename G, typename S>
 property( Owner& p, G g, S s )
  : getterFunc( boost::bind( g, p ) )
  , setterFunc( boost::bind( s, p, _1 ) ) {}
public:
 operator T() const { return getterFunc(); }
 property& operator=( const T& rhs ) {
  setterFunc( rhs ); return *this;
 }
};
0664デフォルトの名無しさんNGNG
>>663
思いっきりテンプレートに見えるのは、気のせいか?
0665デフォルトの名無しさんNGNG
setX, getX でいいでしょ
なんでわざわざそんな不要なコード書きたがるかね
0666デフォルトの名無しさんNGNG
>>665
私はいろいろやって(C++でのプロパティを)諦めた人なので
> setX, getX でいいでしょ
は同意だけど

> なんでわざわざそんな不要なコード書きたがるかね
これ、コボラーの発想だよ。
いいものがあればそれを求める。それが ぷらぷら使いさ。
0667デフォルトの名無しさんNGNG
virtual void* Create()=0;

この、末尾の「=0」ってどういう意味? 
0668デフォルトの名無しさんNGNG
>>667
pure virtual function・・・・・・
0669デフォルトの名無しさんNGNG
ヘッダファイル(拡張子が .h)のファイルの中で、こんな一行が

 class ISerialize;

ソースの後の方で、ちゃんと

class ISerialize {
public:
..

}

というように、定義されているのですが、最初の方で 「class ISerialize; 」と書く意味がわかりません。

どういう意図があるのでしょう。
これは省略できるのですか。
0670デフォルトの名無しさんNGNG
> class ISerialize;
ここから

>class ISerialize {
>public:
>}
までの間で
ISerialize *p ;
とかやったりするため
0671デフォルトの名無しさんNGNG
Do you know declaration of class?
0672デフォルトの名無しさんNGNG
class ISerialize;

class Test {
class ISerialize& is;
};

class ISerialize {
public:
..

}
0673デフォルトの名無しさんNGNG
>>672
class ISerialize;

class Test {
class ISerialize& is;
};

class ISerialize {
public:
Test *t; //ここがなけりゃ意味ないだろ?
}

0674デフォルトの名無しさんNGNG
>>673
そうだったスマソ
0675デフォルトの名無しさんNGNG
海外サイトで通用しなかった英語を
避難先の日本語サイトでひけらかして何になる? (water
0676デフォルトの名無しさんNGNG
>>673
>Test *t;
は参照よりも実体のほうが趣旨に合うと思うが
0677デフォルトの名無しさんNGNG
 virtual int GetType() const = 0;

これはつまり、サブクラスは必ず GetType() で値を返して、しかも、そのサブクラスのサブクラスでは、GetType() をオーバライドできない、ということでしょうか。
0678671NGNG
>>675
うるせー犯すぞ
0679デフォルトの名無しさんNGNG
>>677
Effective C++をどうぞ。
0680デフォルトの名無しさんNGNG
>>677
サブクラスって意味知ってる?

まあそれはそれとして、純粋仮想関数を一つでもメンバとして持っているクラスは
抽象クラスとなり、インスタンスは作成できない。
かならず継承して、純粋仮想関数をすべてオーバーライドして初めてインスタンス
を作成できるようになる。
0681デフォルトの名無しさんNGNG
>>9999
0682デフォルトの名無しさんNGNG
>>677
こんな物だと思いたまへ。

class A {
protected:
int i;
int j;
public:
virtual int f() = 0;
int g() { return j; }
};

class B : public A {
public:
int f() { return i; }
};

int main()
{
// A a; // インスタンスは作成できない
B b;
b.f();
b.g();
}
0683デフォルトの名無しさんNGNG
純粋仮想関数のメリットって何ですか?
0684デフォルトの名無しさんNGNG
>>683
インターフェースと実装を切り離す時に便利。入出力関数が決まっていて、
実装にバリエーションがある時、インターフェース部だけを抽象クラスにして
おいて、一種のテンプレートのようにして使う。
0685デフォルトの名無しさんNGNG
ところでこの板、連続書き込みが規制されてない?
今は串を変えて書いてるけど、プロキシ使ってる人は、まとめて規制食らっ
ちゃうよ。
0686683NGNG
>>684
ありがとうございます。よく分かりました。
0687デフォルトの名無しさんNGNG
void penis_fumble(){ (;´Д`)ハァハァ; }
0688デフォルトの名無しさんNGNG
gotcha!
0689デフォルトの名無しさんNGNG
>>683
メンバ関数のグループ化と規格化
「○○対応をうたうクラスにはこんな関数セットを用意すること」
0690デフォルトの名無しさんNGNG
class A
{
};

class B : public A
{

};

というのがあり、

A* boo(A* obj);

という関数なら、クラスAクラスBのどちらのオブジェクトもとれるのは分かるのですが、

A& boo(A& obj);

なら、Aしか引数,戻り値にすることはできませんか?
0691デフォルトの名無しさんNGNG
やってみりゃいいだろ

B b;

A& boo(A& obj)
{
return b;
}

main()
{
boo(b);
}
0692デフォルトの名無しさんNGNG
>>690
Bもできます
自分で試すきないの?
0693690NGNG
すいません。聞きたかったことを間違えました。

A boo(A& obj)
{
B b = new B();
return b;
}

という場合に、bを返したら、どうなりますか?
外で

B b = (B)boo(obj);

みたいなのはできないんでしょうか?
0694デフォルトの名無しさんNGNG
return *b;
0695デフォルトの名無しさんNGNG
どうでもいいが激しくわかりづらいソースだな。AとかBとか。
0696デフォルトの名無しさんNGNG
>693
実体を基底クラスにキャストするとオブジェクトのスライシング、派生クラス分の
オブジェクトが捨てられて基底クラスに詰め込まれる、が起きる。

ポインタ・参照の場合は(多重継承・仮想継承が絡むと細かいことが色々あるが、
それを忘れれば)何も起こらない。

class Base {};
class Deriv : public Base {}
Base* pb = new Deriv;  // OK

特に Base に仮想関数が定義してある場合、pb 経由で仮想関数を呼び出すと
Deriv の関数が呼ばれる。

class Base { public: virtual void foo(); };
class Deriv { public: virtual void foo(); };
Base* pb = new Deriv;
pb->foo();  // Base::foo() ではなく Deriv::foo() が呼ばれる

逆に基底クラスから派生クラスにキャストするのは、実体の場合には論外。ポインタ・
参照の場合には「実はそのポインタ・参照は派生クラスを指している」という場合に限っ
て OK。そうでない場合には、直後にメモリ領域壊すことになる。

Base* pb = new Deriv;
Drive* pd = static_cast<Deriv*>(pb); // OK

Base* pb = new Base;
Deriv* pd = static_cast<Deriv*>(pb); // コンパイルは通るが、直後に惨状が待ち受けてる

っつか、基本事項だから「プログラミング言語 C++」でも買ってきて読んどけ。一から
十まで説明してたら 1 スレ使っても字数が足りんよ。
0697デフォルトの名無しさんNGNG
>>666
>> なんでわざわざそんな不要なコード書きたがるかね
>これ、コボラーの発想だよ。
 
余計なコードを書かないってのは言語を超えた開発の鉄則。
新規コードは最小限に抑えるべし。
念のために言っておくが、変数・関数名を短くしろとか、
改行を惜しめって意味じゃないからね。
 
無論ひまつぶし等は別だが、その場合はその旨を明記して欲しい。
0698デフォルトの名無しさんNGNG
>>697
一人の人も救えないのに世界を救えるはずがないよな!
0699デフォルトの名無しさんNGNG
>>698
んなこたーない
0700698NGNG
>>699
知ってる
0701デフォルトの名無しさんNGNG
>>683
言語に純仮想関数の機構(late binding)があると、
オブジェクト指向プログラミングができるようになる。
0702デフォルトの名無しさんNGNG
>>701
・・・・・単なる仮想関数でもそうでしょ?
0703デフォルトの名無しさんNGNG
>>701 >>702
うむ。その通りだ。VBもオブジェクト指向プログラミングはできるのだよ。
0704デフォルトの名無しさんNGNG
>>701-703
それは仮想ではなく妄想ではないかと・・・
0705デフォルトの名無しさんNGNG
>>704
あなたこそ妄想です。
0706デフォルトの名無しさんNGNG
ポリモーフィズムできりゃOOPはできる。
(向き不向き存在価値なしはあるにしても)
0707デフォルトの名無しさんNGNG
「オブジェクト指向=多態」と思い込んでいる馬鹿がいるな
0708デフォルトの名無しさんNGNG
typedef aiueo *kakikukeko;

ってのがよく分かりません。

typedef aiueo* kakikukeko;

のことですか?
0709デフォルトの名無しさんNGNG
ソーデース
0710デフォルトの名無しさんNGNG
>>703
そらそーだ
ただ、金属バットで家建てようとしているようなもんだけどな
0711デフォルトの名無しさんNGNG
//文字列でNULLがないときってやばくない?
struct OOO
{
char c[4];
char j;
};
#include<iostream>
#include<string>
#define print(x) std::cout << (x) <<std::endl;
int main()
{
OOO nn = {'3','3','3','3',22};
print( sizeof( nn.c ) );//4
print( strlen( nn.c ) );//11
std::string BadStr= nn.c;
print( BadStr );//3333???????
std::string TrueStr = BadStr.substr(0,(strlen(nn.c) > sizeof(nn.c) ? sizeof(nn.c) : strlen(nn.c)));
print( TrueStr );//3333
}
0712デフォルトの名無しさんNGNG
>>708
kakukikeko は aiueo へのポインタってこと。
aiueo を *kakikukeko であらわせるなら、
&aiueo は kakikukeko でしょ?

aiueo a;
kakukikeko k;
k = &a;
0713デフォルトの名無しさんNGNG
>>711
当たり前だろ。
0714666NGNG
>>697
> 余計なコードを書かないってのは言語を超えた開発の鉄則。

    ま た Y A G N I か
0715デフォルトの名無しさんNGNG
クラスローカルな定数って定義できます?
class MyClass{
 const int err = 1;
}
はできませんでした。
0716デフォルトの名無しさんNGNG
>>715
こういうのはどう鐘。

class MyClass{
 static const int err;
}
const int MyClass::err = 1;
0717デフォルトの名無しさんNGNG
>>715
enum使っとけ。
0718デフォルトの名無しさんNGNG
class MyClass{
 static const int err = 1;
}
なら可能(整数だけだが)。できないコンパイラはヘタレ。
0719デフォルトの名無しさんNGNG
>>714
つまり、度々無駄なコードを書いては先輩や上司から叱責されていると?
0720デフォルトの名無しさんNGNG
>>715
確かにえなーむが妥当
0721デフォルトの名無しさんNGNG
class MyClass{
 const int err;
}

MyClass::MyClass() : err(1) {
}
0722デフォルトの名無しさんNGNG
セミコロンを忘れずに・・・
0723721NGNG
>>722
正直、すまんかった。
浮気性なもんでJava子や#子の癖が出るんでね。

class MyClass{
 const int err;
};

MyClass:MyClass() : err(1){
}
0724デフォルトの名無しさんNGNG
>>723
こんどはコロンが一つ…
0725デフォルトの名無しさんNGNG
コンロも一つ
0726デフォルトの名無しさんNGNG
蝉を退治する殺虫剤で「セミコロン」とか作ったら面白いよね。
0727デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0728328NGNG
>>726
オレはオマエのほうが面白いと思うがどうか。
0729デフォルトの名無しさんNGNG
328 は意味不明だが、728 には同意
0730デフォルトの名無しさんNGNG
随分と突飛だな。
0731デフォルトの名無しさんNGNG
>>728
面白いというかおっぱいしゃぶりたいよね。
0732デフォルトの名無しさんNGNG
void* から非void型への変換のキャストって???
0733デフォルトの名無しさんNGNG
???
0734デフォルトの名無しさんNGNG
>>732
何がいいたいのかサパーリわからん。

template<typename T>
T void_ptr_to_hoge(void* p)
{
 return reinterpret_cast<T>(p);
}

↑でいいのか?
0735デフォルトの名無しさんNGNG
void* は非 void 型だよな
0736デフォルトの名無しさんNGNG
borland C++ 使ってるんですが
マルチスレッド化のやり方がわかりません。
教えてください 頼みます
0737デフォルトの名無しさんNGNG
>>736
WindowsならWin32APIのCreateThreadでいいんじゃない?
0738デフォルトの名無しさんNGNG
猫を呼んで来い
0739デフォルトの名無しさんNGNG
 =⊂(ΦωΦ)⊃

呼んで来ました!
0740デフォルトの名無しさんNGNG
。 猫じゃないものがキタぁぁぁぁ!!
。   ∧_∧。゚
 ゚  (゚ ´Д`゚ )っ゚
  (つ   /  アァァァァ
    |  (⌒)
   し⌒^
0741デフォルトの名無しさんNGNG
>>734
static_castじゃないんか?
0742デフォルトの名無しさんNGNG
static_cast でいいのか?
reinterpret_cast のが妥当だと思うが・・・。
0743デフォルトの名無しさんNGNG
reinterpret_castだよ。
0744デフォルトの名無しさんNGNG
C++で作成したアプリケーションについてですが
Spy++とかで確認することができる
クラス名があるじゃないですか。
あれはバイナリ(exe)にはどんな風にして格納されてるんでしょうか?

やりたいことはメインウィンドウのクラス名を
バイナリエディタで書き換えたいのです。

よろしくおながいします(´・ω・`)
0745デフォルトの名無しさんNGNG
> Spy++とかで確認することができる
> クラス名があるじゃないですか。

・・・え?
もしかして、ウィンドウクラスの事?
ならスレ違いと言っておこう。
0746デフォルトの名無しさんNGNG
>>745
すれ違いでしたか(´-ω-`;)
C++で作られたプログラムということだったので
こちらで質問してしまいました。ごめんなさいです。
もしよかったらどこのスレッドで聞けば
答えてもらえるのかだけでも教えてもらえませんでしょうか。
ほんとすいません・・・。
0747デフォルトの名無しさんNGNG
C++ で作られたプログラムだろうが、C++ の事について訊きたいのでなければ
スレ違い。
妥当なのはぱっと思いつかないけど、近そうなのは Win32API スレ、Windows
Programing スレあたりか。
0748デフォルトの名無しさんNGNG
>>747
ありがとうございますです。
さっそくそちらのほうに尋ねてみたいと思いまつ(´・ω・`)
0749デフォルトの名無しさんNGNG
class Baka
{
friend ostream& operator<<(ostream& os, const Baka& obj);
private:
int aho;
};

として、cppファイルのほうでoperator<<のほうを実装すると、
この関数は、privateにアクセスでききない。と出ます。

クラス宣言の中で、インラインで書いてやると、コンパイル通ります。
コンパイラはVS.NETを使っているのですが、コンパイラの仕様ですか?
何か間違っているのでしょうか?
0750デフォルトの名無しさんNGNG
>>749
classのデフォルトのアクセス権はprivateです。
0751デフォルトの名無しさんNGNG
d2fc22-022.tiki.ne.jp
0752デフォルトの名無しさんNGNG
>>749
> 何か間違っているのでしょうか?
お前の関数の書き方。
0753デフォルトの名無しさんNGNG
>>749
その .cpp での実装もさらせ。
0754デフォルトの名無しさんNGNG
>>749
普通に通るけど何か問題でも?

class Baka
{
friend std::ostream& operator<<(std::ostream& os, const Baka& obj);
int aho;
public:
Baka(int i) : aho(i) {}
};

std::ostream& operator<<(std::ostream& os, const Baka& obj)
{
os << obj.aho;
return os;
}

int main()
{
Baka b(123);

std::cout << b << std::endl;
}
■ このスレッドは過去ログ倉庫に格納されています