C++相談室 part13
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの引き篭もり
NGNGelegantなソースを目指してね。
( ^-゚).。o(きっと関連URLは >>2-5 辺りだよ)
0655デフォルトの名無しさん
NGNG是非マイクロソフトさんにも言ってあげてください。
0656デフォルトの名無しさん
NGNG> 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#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それ漏れも考えて書こうと思ったけどやめた。
値の範囲チェックとかどうすんのよ?
0660デフォルトの名無しさん
NGNGしかもそれだけでいいのなら
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これじゃダメ?
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だな。
0663デフォルトの名無しさん
NGNGそれだけでいいのなら
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思いっきりテンプレートに見えるのは、気のせいか?
0665デフォルトの名無しさん
NGNGなんでわざわざそんな不要なコード書きたがるかね
0666デフォルトの名無しさん
NGNG私はいろいろやって(C++でのプロパティを)諦めた人なので
> setX, getX でいいでしょ
は同意だけど
> なんでわざわざそんな不要なコード書きたがるかね
これ、コボラーの発想だよ。
いいものがあればそれを求める。それが ぷらぷら使いさ。
0667デフォルトの名無しさん
NGNGこの、末尾の「=0」ってどういう意味?
0668デフォルトの名無しさん
NGNGpure virtual function・・・・・・
0669デフォルトの名無しさん
NGNGclass ISerialize;
ソースの後の方で、ちゃんと
class ISerialize {
public:
..
}
というように、定義されているのですが、最初の方で 「class ISerialize; 」と書く意味がわかりません。
どういう意図があるのでしょう。
これは省略できるのですか。
0670デフォルトの名無しさん
NGNGここから
>class ISerialize {
>public:
>}
までの間で
ISerialize *p ;
とかやったりするため
0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNGclass Test {
class ISerialize& is;
};
class ISerialize {
public:
..
}
0673デフォルトの名無しさん
NGNGclass ISerialize;
class Test {
class ISerialize& is;
};
class ISerialize {
public:
Test *t; //ここがなけりゃ意味ないだろ?
}
0674デフォルトの名無しさん
NGNGそうだったスマソ
0675デフォルトの名無しさん
NGNG避難先の日本語サイトでひけらかして何になる? (water
0676デフォルトの名無しさん
NGNG>Test *t;
は参照よりも実体のほうが趣旨に合うと思うが
0677デフォルトの名無しさん
NGNGこれはつまり、サブクラスは必ず GetType() で値を返して、しかも、そのサブクラスのサブクラスでは、GetType() をオーバライドできない、ということでしょうか。
0679デフォルトの名無しさん
NGNGEffective C++をどうぞ。
0680デフォルトの名無しさん
NGNGサブクラスって意味知ってる?
まあそれはそれとして、純粋仮想関数を一つでもメンバとして持っているクラスは
抽象クラスとなり、インスタンスは作成できない。
かならず継承して、純粋仮想関数をすべてオーバーライドして初めてインスタンス
を作成できるようになる。
0681デフォルトの名無しさん
NGNG0682デフォルトの名無しさん
NGNGこんな物だと思いたまへ。
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デフォルトの名無しさん
NGNG0684デフォルトの名無しさん
NGNGインターフェースと実装を切り離す時に便利。入出力関数が決まっていて、
実装にバリエーションがある時、インターフェース部だけを抽象クラスにして
おいて、一種のテンプレートのようにして使う。
0685デフォルトの名無しさん
NGNG今は串を変えて書いてるけど、プロキシ使ってる人は、まとめて規制食らっ
ちゃうよ。
0686683
NGNGありがとうございます。よく分かりました。
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG0689デフォルトの名無しさん
NGNGメンバ関数のグループ化と規格化
「○○対応をうたうクラスにはこんな関数セットを用意すること」
0690デフォルトの名無しさん
NGNG{
};
class B : public A
{
};
というのがあり、
A* boo(A* obj);
という関数なら、クラスAクラスBのどちらのオブジェクトもとれるのは分かるのですが、
A& boo(A& obj);
なら、Aしか引数,戻り値にすることはできませんか?
0691デフォルトの名無しさん
NGNGB b;
A& boo(A& obj)
{
return b;
}
main()
{
boo(b);
}
0692デフォルトの名無しさん
NGNGBもできます
自分で試すきないの?
0693690
NGNGA boo(A& obj)
{
B b = new B();
return b;
}
という場合に、bを返したら、どうなりますか?
外で
B b = (B)boo(obj);
みたいなのはできないんでしょうか?
0694デフォルトの名無しさん
NGNG0695デフォルトの名無しさん
NGNG0696デフォルトの名無しさん
NGNG実体を基底クラスにキャストするとオブジェクトのスライシング、派生クラス分の
オブジェクトが捨てられて基底クラスに詰め込まれる、が起きる。
ポインタ・参照の場合は(多重継承・仮想継承が絡むと細かいことが色々あるが、
それを忘れれば)何も起こらない。
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>> なんでわざわざそんな不要なコード書きたがるかね
>これ、コボラーの発想だよ。
余計なコードを書かないってのは言語を超えた開発の鉄則。
新規コードは最小限に抑えるべし。
念のために言っておくが、変数・関数名を短くしろとか、
改行を惜しめって意味じゃないからね。
無論ひまつぶし等は別だが、その場合はその旨を明記して欲しい。
0698デフォルトの名無しさん
NGNG一人の人も救えないのに世界を救えるはずがないよな!
0699デフォルトの名無しさん
NGNGんなこたーない
0701デフォルトの名無しさん
NGNG言語に純仮想関数の機構(late binding)があると、
オブジェクト指向プログラミングができるようになる。
0702デフォルトの名無しさん
NGNG・・・・・単なる仮想関数でもそうでしょ?
0703デフォルトの名無しさん
NGNGうむ。その通りだ。VBもオブジェクト指向プログラミングはできるのだよ。
0704デフォルトの名無しさん
NGNGそれは仮想ではなく妄想ではないかと・・・
0705デフォルトの名無しさん
NGNGあなたこそ妄想です。
0706デフォルトの名無しさん
NGNG(向き不向き存在価値なしはあるにしても)
0707デフォルトの名無しさん
NGNG0708デフォルトの名無しさん
NGNGってのがよく分かりません。
typedef aiueo* kakikukeko;
のことですか?
0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNGそらそーだ
ただ、金属バットで家建てようとしているようなもんだけどな
0711デフォルトの名無しさん
NGNGstruct 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デフォルトの名無しさん
NGNGkakukikeko は aiueo へのポインタってこと。
aiueo を *kakikukeko であらわせるなら、
&aiueo は kakikukeko でしょ?
aiueo a;
kakukikeko k;
k = &a;
0713デフォルトの名無しさん
NGNG当たり前だろ。
0715デフォルトの名無しさん
NGNGclass MyClass{
const int err = 1;
}
はできませんでした。
0716デフォルトの名無しさん
NGNGこういうのはどう鐘。
class MyClass{
static const int err;
}
const int MyClass::err = 1;
0717デフォルトの名無しさん
NGNGenum使っとけ。
0718デフォルトの名無しさん
NGNGstatic const int err = 1;
}
なら可能(整数だけだが)。できないコンパイラはヘタレ。
0719デフォルトの名無しさん
NGNGつまり、度々無駄なコードを書いては先輩や上司から叱責されていると?
0720デフォルトの名無しさん
NGNG確かにえなーむが妥当
0721デフォルトの名無しさん
NGNGconst int err;
}
MyClass::MyClass() : err(1) {
}
0722デフォルトの名無しさん
NGNG0723721
NGNG正直、すまんかった。
浮気性なもんでJava子や#子の癖が出るんでね。
class MyClass{
const int err;
};
MyClass:MyClass() : err(1){
}
0724デフォルトの名無しさん
NGNGこんどはコロンが一つ…
0725デフォルトの名無しさん
NGNG0726デフォルトの名無しさん
NGNG0727デフォルトの名無しさん
NGNG0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNG面白いというかおっぱいしゃぶりたいよね。
0732デフォルトの名無しさん
NGNG0733デフォルトの名無しさん
NGNG0734デフォルトの名無しさん
NGNG何がいいたいのかサパーリわからん。
template<typename T>
T void_ptr_to_hoge(void* p)
{
return reinterpret_cast<T>(p);
}
↑でいいのか?
0735デフォルトの名無しさん
NGNG0736デフォルトの名無しさん
NGNGマルチスレッド化のやり方がわかりません。
教えてください 頼みます
0737デフォルトの名無しさん
NGNGWindowsならWin32APIのCreateThreadでいいんじゃない?
0738デフォルトの名無しさん
NGNG0739デフォルトの名無しさん
NGNG呼んで来ました!
0740デフォルトの名無しさん
NGNG。 ∧_∧。゚
゚ (゚ ´Д`゚ )っ゚
(つ / アァァァァ
| (⌒)
し⌒^
0741デフォルトの名無しさん
NGNGstatic_castじゃないんか?
0742デフォルトの名無しさん
NGNGreinterpret_cast のが妥当だと思うが・・・。
0743デフォルトの名無しさん
NGNG0744デフォルトの名無しさん
NGNGSpy++とかで確認することができる
クラス名があるじゃないですか。
あれはバイナリ(exe)にはどんな風にして格納されてるんでしょうか?
やりたいことはメインウィンドウのクラス名を
バイナリエディタで書き換えたいのです。
よろしくおながいします(´・ω・`)
0745デフォルトの名無しさん
NGNG> クラス名があるじゃないですか。
・・・え?
もしかして、ウィンドウクラスの事?
ならスレ違いと言っておこう。
0746デフォルトの名無しさん
NGNGすれ違いでしたか(´-ω-`;)
C++で作られたプログラムということだったので
こちらで質問してしまいました。ごめんなさいです。
もしよかったらどこのスレッドで聞けば
答えてもらえるのかだけでも教えてもらえませんでしょうか。
ほんとすいません・・・。
0747デフォルトの名無しさん
NGNGスレ違い。
妥当なのはぱっと思いつかないけど、近そうなのは Win32API スレ、Windows
Programing スレあたりか。
0748デフォルトの名無しさん
NGNGありがとうございますです。
さっそくそちらのほうに尋ねてみたいと思いまつ(´・ω・`)
0749デフォルトの名無しさん
NGNG{
friend ostream& operator<<(ostream& os, const Baka& obj);
private:
int aho;
};
として、cppファイルのほうでoperator<<のほうを実装すると、
この関数は、privateにアクセスでききない。と出ます。
クラス宣言の中で、インラインで書いてやると、コンパイル通ります。
コンパイラはVS.NETを使っているのですが、コンパイラの仕様ですか?
何か間違っているのでしょうか?
0750デフォルトの名無しさん
NGNGclassのデフォルトのアクセス権はprivateです。
0751デフォルトの名無しさん
NGNG0752デフォルトの名無しさん
NGNG> 何か間違っているのでしょうか?
お前の関数の書き方。
0753デフォルトの名無しさん
NGNGその .cpp での実装もさらせ。
0754デフォルトの名無しさん
NGNG普通に通るけど何か問題でも?
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;
}
■ このスレッドは過去ログ倉庫に格納されています