■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part41
751 名前:デフォルトの名無しさん :2005/08/07(日) 14:17:44
かなり初歩的な質問ですいませんが教えてください。
特別バージョンに指定するtemplate<>ですが、どうしてこれを書く必要があるのかわかりません。

template<typename T>
class C {
  // ...
};

//template<>
class C<int> {
  // ...
};

下が上の特別バージョンであることをコンパイラは判断できないんですか?

752 名前:デフォルトの名無しさん :2005/08/07(日) 15:07:07
>>751 回答じゃなくて悪いが、なんでこれが初歩的な質問だと思ったんだ?

753 名前:デフォルトの名無しさん :2005/08/07(日) 15:12:40
>>751
下の書き方じゃ変数化したいintと普通のintの区別が付かないから

754 名前:デフォルトの名無しさん :2005/08/07(日) 15:14:13
>>751
明示的インスタンス化の宣言が template class C<int>; だから、
class C<int>; だけの場合を許すとして、
明示的インスタンス化と見るか明示的特殊化と見るかを決めかねるんじゃないか?

755 名前:デフォルトの名無しさん :2005/08/07(日) 16:05:20
>>752
なにぶんテンプレート初心者なもので。

>>753
テンプレート引数なのか型名なのか区別が付かないということでしょうか??

>>754
定義も一緒にする場合にはtemplate<>は付けなくてもいいということですか?
template<typename T> class C
{
public:
  void f() {
    printf("C<T>::f\n");
  }
};
//template<>
class C<int> {
public:
  void f() {
   printf("C<int>::f\n");
  }
};
void main() {
  C<float> c1;
  c1.f();
  C<int> c2;
  c2.f();
}
とりあえず上のプログラムをVSN2002でコンパイルしたら下のような出力になりました。
C<T>::f
C<int>::f

756 名前:754 :2005/08/07(日) 16:22:49
>>755
伝わらなかったみたいだな。ごめんよ。

class C<int>; を許すとして、
template class C<int>; と見るか、
template<> class C<int>; と見るか、
どっちにするか決められないんじゃないか、ってこと。

757 名前:デフォルトの名無しさん :2005/08/07(日) 16:23:55
C++知らないんだけど、その二つはどうちがうの?

758 名前:デフォルトの名無しさん :2005/08/07(日) 16:24:54
>>757
C++知らないのにどうしてここを見ているの?

759 名前:754 :2005/08/07(日) 16:30:01
あれ?
gcc 3.4.4 でも MSC でも class C<int>; が
明示的特殊化の宣言( template<> class C<int>; )として通った。
こんなの規格にあったっけ?

760 名前:754 :2005/08/07(日) 16:37:14
定義も加えようとする( class C<int> {}; )と、エラーになる。

gcc 3.4.4:
error: an explicit specialization must be preceded by 'template <>'

vctoolkit2003:
error C2906: 'C<int>' : explicit specialization requires 'template <>'

どちらも明示的特殊化として認識はできているが、
文法としては template<> が必要だからしょうがなくエラーって感じだな。

761 名前:デフォルトの名無しさん :2005/08/07(日) 16:47:57
とりあえずtemplate<>は付けておかないとダメそうということはわかりました。
これは言語の仕様として必ず必要ということになってるんでしょうか?
それともコンパイラに依存するとなっているんでしょうか?


762 名前:デフォルトの名無しさん :2005/08/07(日) 16:54:16
>>761 http://www.kuzbass.ru/docs/isocpp/template.html#temp.expl.spec

763 名前:デフォルトの名無しさん :2005/08/07(日) 17:02:47
>>762
言語仕様として必要なんですね。
それだけわかれば良かったんです。
コンパイラの話にしてしまってすいません。
ありがとうございました。

764 名前:デフォルトの名無しさん :2005/08/08(月) 00:49:46
>759
class C<int> なら構文的には forward declaration として認識されるような気がする。
規格書ちゃらっと見てみた限りでは friend 宣言で使われてたよーな。

765 名前:デフォルトの名無しさん :2005/08/08(月) 00:55:33
>764 補足
セミコロンが抜けた。 class C<int>; ね。
で、friend class task<int>; って記述があったってことね。

766 名前:デフォルトの名無しさん :2005/08/08(月) 01:07:45
>>764-765
構文として forward declaration などというものは存在しないわけで、何が言いたいのかわからん。

767 名前:デフォルトの名無しさん :2005/08/08(月) 03:13:16
C++で使えるコルーチンライブラリってある?

768 名前:デフォルトの名無しさん :2005/08/08(月) 06:03:49
>>767 Win32API Fiber Functions

769 名前:デフォルトの名無しさん :2005/08/08(月) 21:50:52
>766
構文としては explicit-specialization じゃなくて単なる declaration であり、
解釈としては forward declaration として見なされるのではないか?ということです。

770 名前:デフォルトの名無しさん :2005/08/08(月) 23:07:16
>>769
ISO/IEC 14882:2003にない造語で勝手に語らないでくれないか。

771 名前:デフォルトの名無しさん :2005/08/08(月) 23:11:09
>>770
オマエモナー

772 名前:デフォルトの名無しさん :2005/08/08(月) 23:26:31
>>771
???

773 名前:デフォルトの名無しさん :2005/08/08(月) 23:32:51
you too

774 名前:デフォルトの名無しさん :2005/08/08(月) 23:59:27
>>771
「オマエモナー」の使い方がおかしい。

775 名前:デフォルトの名無しさん :2005/08/09(火) 02:01:36
>>769
ちょっと >759 を読み直してみろよ。

構文としては simple-declaration であるはずの class C<int>; が
explicit-specialization と同様に扱われているようだが、
そう扱うように規格で定められているのか?というのが問題なわけよ。

「forward declaration として見なされるのではないか?」なんてのは的外れ。
そもそも「forward declaration」という言葉の意味が
規格中で定義されていないので、この流れの中では意味不明。

776 名前:デフォルトの名無しさん :2005/08/09(火) 03:34:32
>775
ごめん。
確かに的はずれで、explicit-specialization 「の宣言」 (14.7.3/2) が俺脳内 forward declaration そのものでした。

forward declaration については 9.1/2 で言及があるんですが、class-key identifier の場合なので template-id
である今回の場合はあてはまらない。
7.1.5.3 の elaborated type specifier で、かつ単一の構成要素なので 7.1.5.3/1 の場合だと思うんですが、
そうすると friend ついてないし、結局 explicit specialization か explicit instantiation じゃないとだめ。
でも template も template <> もついてないから、そっちもだめ。

この辺は friend class C<int>; を認めるために 14882:1998 から変更されてるみたいですが、
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#68
規格上は class C<int>; は ill-formed だというのが正しいんじゃないでしょうか?

777 名前:デフォルトの名無しさん :2005/08/09(火) 04:35:30
コンストラクタ初期化子で
配列を初期化するのは可能なのでしょうか?


778 名前:デフォルトの名無しさん :2005/08/09(火) 09:25:11
>>777
ごめんC++の限界

779 名前:デフォルトの名無しさん :2005/08/09(火) 10:32:04
>>777
配列の代わりにvectorを使うとか


780 名前:デフォルトの名無しさん :2005/08/09(火) 12:05:02
RGB → BGR 変換ってどうやったらいいでしょうか?

781 名前:デフォルトの名無しさん :2005/08/09(火) 12:15:15
C++にはRGBもBGRもありません。

782 名前:デフォルトの名無しさん :2005/08/09(火) 12:16:04
>>780 シラネーヨ

783 名前:デフォルトの名無しさん :2005/08/09(火) 12:33:33
RGB→BGR変換って、
RGB old;
BGR new;
new.b = old.b;
new.g = old.g;
new.r = old.r;
ってこと?
どうやるもへったくれもなさそうなんだけど。

784 名前:デフォルトの名無しさん :2005/08/09(火) 13:56:28
つまらんネタでひっぱらなくてよろし

785 名前:デフォルトの名無しさん :2005/08/09(火) 15:21:34
Platform SDKがインストールできません。
Microsoft Platfrom SDK\Help\PSDK.hxq
というところで必ず停止します。仕方ないのでインストールをキャンセル。

786 名前:デフォルトの名無しさん :2005/08/09(火) 16:39:52
あは先週の俺と同じところでひっかかってる。
たしかどこかにすべてローカルにDownしてからインスコできるモジュールが
あったのでそれを入手すればなんとか。
coreSDKあたりでぐぐればヒットする。

787 名前:デフォルトの名無しさん :2005/08/09(火) 19:33:04
インターフェース用の抽象クラスa,bと、aを継承したAがある。
こんな状態で、aとb両方のインターフェースをもったクラスへのポインタを
引数として受け取るクラスCはどうやったら定義できるでしょうか。

つまりCは、a及びbを継承したクラスabと、A及びbを継承したクラスAbの
どちらも渡せるような物にしたいんです。

788 名前:デフォルトの名無しさん :2005/08/09(火) 19:39:58
>>787
C は「クラス」じゃなくて関数の間違いですよね。
漏れなら単に void C(a*, b*) と引数を2つにするけど。
interface も2つに分かれてるんだしさ。

789 名前:デフォルトの名無しさん :2005/08/09(火) 20:41:37
>>788
a,bのインターフェースを持った物ではなく、a,b両方のインターフェースを持ったものみ渡したいんです。。

790 名前:デフォルトの名無しさん :2005/08/09(火) 20:48:54
>>789
それを1つの引数で済ませるようなことはしない、っていう意味。
4つも5つもinterfaceがあるならまた話は別だけど・・

791 名前:デフォルトの名無しさん :2005/08/09(火) 20:53:57
>>787
struct ab : a, b { };
struct C : std::unary_function<ab&, void> { };
とかは?

792 名前:デフォルトの名無しさん :2005/08/09(火) 20:54:50
template parameterで頑張ればa,bの両方を継承したclassのみを受け取り
それ以外はコンパイルエラーにすることもできるかもね

793 名前:デフォルトの名無しさん :2005/08/09(火) 20:55:29
インターフェイス継承してるときは dynamic_cast も嫌だけど使う

794 名前:デフォルトの名無しさん :2005/08/09(火) 21:15:22
これでどうだ。仮想継承にしなくても当然適切な関数が呼ばれるが一応そうした。
struct a {virtual void FuncA() = 0;};
struct b {virtual void FuncB() = 0;};
struct interface_ab : virtual public a, virtual public b {};
struct A : virtual public a {
    void FuncA() {
        std::cout << "A::FuncA" << std::endl;
    }
};
struct ab : public interface_ab {
    void FuncA() {
        std::cout << "ab::FuncA" << std::endl;
    }
    void FuncB() {
        std::cout << "ab::FuncB" << std::endl;
    }
};
struct Ab : virtual public A, virtual public ab {
    void FuncA() {
        A::FuncA();
    }
};
void c(interface_ab& hoge) {
    hoge.FuncA();
    hoge.FuncB();
}
int main() {
    Ab obj;
    c(obj);
}

795 名前:デフォルトの名無しさん :2005/08/09(火) 21:22:01
a,bだけでなくさらにabも継承しないといけない解法か。。

796 名前:デフォルトの名無しさん :2005/08/09(火) 22:16:59
>>790
両方の引数に同じポインタを渡すってコトですか?
それはちょっとかっこ悪い気がするんですが。。

>>791
関数オブジェクトを知らないので、使い方がよくワカリマセン。
Abとかは、その場合のab&にキャストできるんでしょうか??

>>794
自分もその方法は思いつきました。
が、仮想継承じゃないとコンパイルエラーが出たんですが、仮想継承じゃなくてもいけるんでしょうか?
仮想継承は遅いらしいので、この方法以外を探していたのですが。

797 名前:デフォルトの名無しさん :2005/08/09(火) 23:09:07
>>796
>仮想継承は遅いらしいので
あんたのアプリで問題になるほど重いとはかぎらんだろ。
何故簡単に解決する方法があるのにそれを試さない。

798 名前:デフォルトの名無しさん :2005/08/09(火) 23:13:27
っていうか設計が悪い気がする…
なんでそういうことをしたいのか理由が知りたい

799 名前:デフォルトの名無しさん :2005/08/10(水) 01:36:24
今時仮想継承で遅いとか寝言いうやつがいるのか・・・

800 名前:デフォルトの名無しさん :2005/08/10(水) 04:19:41
仮想継承で遅いか。マシンをグレードアップすれば済む話じゃないか。

801 名前:デフォルトの名無しさん :2005/08/10(水) 09:38:01
やっぱりCが最高だよ。もうCに戻ろうよ。

802 名前:デフォルトの名無しさん :2005/08/10(水) 11:02:28
>>787
単純に

void func_a_b(a *pa, b *pb)
{
pa->func_a();
pb->func_b();
}

template<typename T>
void func_ab(T *pab)
{
func_a_b(pab, pab);//T*はa*,b*へ変換できること。
};

みたいなのじゃだめ?
T* が a* と b* に変換できる場合だけコンパイルが通ると思うけど。
基本的に>>788と同じだけど、一応呼び出し側は一つだけ渡せば済むということで。

既に型がa*だけとかb*だけとかになってしまっているのなら
dynamic_castなり何なりを使って動的に両方のインタフェースを持っていることを
確認するしか無いと思う。静的に確認する方法は無いよね。


803 名前:デフォルトの名無しさん :2005/08/11(木) 12:05:29
こんにちは、

プリプロセッサによる条件文を記述しようとしているのですが、
Windows環境でのビルドだと、指定したインクルード(#include "MyWinApp.h")がされるようにしたいのです。
プリプロセッサに何をしていすればいいのでしょーか?

よろしくお願いします。

#ifdef ?
#include "MyWinApp.h"
#else
#include "MyApp.h"
#endif

804 名前:デフォルトの名無しさん :2005/08/11(木) 12:11:05
>>803
スレ違い。環境依存。C++には定義されていない。

805 名前:デフォルトの名無しさん :2005/08/11(木) 13:34:27
>>803
これだけのことじゃないのかな?

//#define WINDOWS //Winの時だけコメントから外す

#ifdef WINDOWS
#include "MyWinApp.h"
#else
#include "MyApp.h"
#endif

WINDOWS という識別子は変えた方がいいだろうけど

806 名前:デフォルトの名無しさん :2005/08/11(木) 13:39:34
>>804
処理系依存だろ?

807 名前:デフォルトの名無しさん :2005/08/11(木) 13:45:28
>>803
とりあえずこの辺でもみとけ。
ttp://www.boost.org/boost/config/


808 名前:デフォルトの名無しさん :2005/08/11(木) 20:47:49
>>803
ここで聞くといい
http://pc8.2ch.net/test/read.cgi/tech/1122723009/

809 名前:デフォルトの名無しさん :2005/08/11(木) 21:10:24
>>803
コンパイラのマニュアル嫁
某のコンパイラだと
__WIN32__と_Windowsが定義されてる

810 名前:デフォルトの名無しさん :2005/08/11(木) 23:17:32
struct S { static int const zero = 0; friend int f(int a = zero); };
このデフォルト引数の指定がgcc(3.4.4 cygwin)でエラーになります。
error: `zero' was not declared in this scope

friendじゃない、普通のメンバ関数ならデフォルト引数の指定にzeroが使えました。
VCだと通るみたいなんで、gccのバグでしょうか?

811 名前:デフォルトの名無しさん :2005/08/11(木) 23:19:44
>>810
随伴は外部スコープを持つ

812 名前:デフォルトの名無しさん :2005/08/11(木) 23:21:14
なんつーか、gccが正解。
VCの方がむしろ拡張。

813 名前:デフォルトの名無しさん :2005/08/11(木) 23:23:37
>>811-812
できれば、規格で対応する記述のあるセクション番号などをお願いします。

814 名前:デフォルトの名無しさん :2005/08/11(木) 23:30:50
>>811
それだと、こっちもエラーにならないとおかしいんじゃないですか?
struct S { static int const zero = 0; friend int f() { return zero; } };

こっちはgccでもVCでもエラーになりません。

815 名前:デフォルトの名無しさん :2005/08/12(金) 00:18:50
>>810 , 814
規格とかよく知らんが、少なくとも漏れの目には810と814でf()のスコープが違うように見えるが。

816 名前:デフォルトの名無しさん :2005/08/12(金) 00:45:11
メンバ関数ポインタについて教えてください。

class A {
  func(int i);     // 1
  func(double d);  // 2
};

の2のポインタが欲しいときはどうすればいいのでしょうか。

817 名前:デフォルトの名無しさん :2005/08/12(金) 00:47:36
そもそもそれ戻り値の型ないじゃん

818 名前:デフォルトの名無しさん :2005/08/12(金) 00:47:55
戻り値型が書いてないが

819 名前:816 :2005/08/12(金) 00:49:47
ごめんなさい。あせりました。

メンバ関数ポインタについて教えてください。

class A {
  void func(int i);     // 1
  void func(double d);  // 2
};

の2のポインタが欲しいときはどうすればいいのでしょうか。

820 名前:デフォルトの名無しさん :2005/08/12(金) 00:51:47
あとスコープがprivateだと実例が出しにくいと思われ。

で、どうすんだろ、オーバーロードされてっから関数名じゃ特定できないな。

821 名前:デフォルトの名無しさん :2005/08/12(金) 00:54:04
なるほど,オーバーロードしているんですな.型は以下のとおり.

void (A::*)(int); // 1
void (A::*)(double); // 2

で,

void (A::*pmf1)(int) = &A::func; // pmf1という変数に1へのポインタを代入
void (A::*pmf2)(double) = &A::func; // pmf2という変数に2へのポインタを代入

822 名前:デフォルトの名無しさん :2005/08/12(金) 00:56:24
へぇ、型に合わせて選択してくれるんだ。
しらんかった。

823 名前:816 :2005/08/12(金) 00:56:26
ありがとうございます。
変数の宣言のしかたで区別してもらえるんですね。
やってみます。

824 名前:デフォルトの名無しさん :2005/08/12(金) 00:57:23
>>820
オーバーロードされている関数のポインタを取る場合,
代入先の変数の型によってあいまい性が解消されるという規則があります.
static_castのような明示的なキャストによる曖昧性の解消も可能です.

static_cast<void (A::*)(int)>(&A::func); // 1へのポインタを指定
static_cast<void (A::*)(double)>(&A::func); // 2へのポインタを指定

825 名前:816 :2005/08/12(金) 03:45:33
やりたかったことができました。
ありがとうございました。
ご報告まで。

826 名前:デフォルトの名無しさん :2005/08/12(金) 09:04:41
フレンド関数てどんな場合に使うんですか?
普通に設計してればいらない気がするんですが・・・
横着したいとき用というわけでもないですよね

827 名前:デフォルトの名無しさん :2005/08/12(金) 09:39:01
>>826
唯一使っても良いと思えるのはクラスに対するオペレーターオーバーロードだけだね。

828 名前:デフォルトの名無しさん :2005/08/12(金) 09:44:14
>>827
それもあんまり使い道ないと思うよ。

829 名前:デフォルトの名無しさん :2005/08/12(金) 10:00:02
行列とベクトルの乗算にoperator*をフレンドでオーバーロードするのは
使い道なしってことですか。

830 名前:デフォルトの名無しさん :2005/08/12(金) 10:15:22
クラスメンバのoperator *=()を呼ぶようにすればってのはだめか?

831 名前:デフォルトの名無しさん :2005/08/12(金) 10:27:11
>>815
810も814も f() はグローバルで同じスコープだろ。(両方とも ::f() )

832 名前:デフォルトの名無しさん :2005/08/12(金) 12:54:01
>>826
行儀良くしてると遅くなるとき

833 名前:デフォルトの名無しさん :2005/08/12(金) 12:58:33
マジレスしてやりたいが、「普通の設計」という予防線がある以上
何言っても設計が悪いではねられそうで警戒しちまうなw

834 名前:デフォルトの名無しさん :2005/08/12(金) 13:06:13
>>833
あるあるw

835 名前:デフォルトの名無しさん :2005/08/12(金) 13:24:40
乱発は良くないですねとしか言いようがない。俺はたまに使ってるけど

836 名前:デフォルトの名無しさん :2005/08/12(金) 13:36:20
>>832が一番無難な説明かな

837 名前:デフォルトの名無しさん :2005/08/12(金) 13:50:50
friendはカプセル化に穴を開けるから、原則として使ってはいけないと
思いこんでる香具師大杉。
「C++の設計と進化」P64を嫁。

838 名前:デフォルトの名無しさん :2005/08/12(金) 14:05:35
後藤と同じ類だな

839 名前:デフォルトの名無しさん :2005/08/12(金) 19:35:49
質問です

int main ()
{
 char *pBuffer;

 pBuffer = new char *[5]; // char * 型のメモリを確保
 pBuffer[0] = new char[20]; // ↑で確保したメモリのひとつにchar型のメモリを確保

 strcpy(pBuffer[0], "Helo C++ World"); // 確保したchar型のメモリに文字列を入れる

 cout << pBuffer << endl;

 delete [] pBuffer[0];
 delete [] pBuffer;
 return 0;
}

上のように、キャラポインタ型のデータを確保して、
その確保したデータに文字列を入れたいのですが、

 pBuffer = new char *[5]; // char * 型のメモリを確保

ここで引っかかってしまいます。
char*型のメモリって、確保できないんでしょうか?
どなたかどうかお願いします m(__)m

840 名前:デフォルトの名無しさん :2005/08/12(金) 19:39:42
char **pBuffer;
pBuffer = new char *[5]; // char * 型のメモリを確保
pBuffer[0] = new char[20]; // ↑で確保したメモリのひとつにchar型のメモリを確保
strcpy(pBuffer[0], "Helo C++ World"); // 確保したchar型のメモリに文字列を入れる
cout << *pBuffer << endl;
delete [] pBuffer[0];
delete [] pBuffer;

すいません、自己解決?しちゃいました・・
char **pBuffer;
ってやったら、うまくいっちゃいました。
これで正しいでしょうか?

841 名前:デフォルトの名無しさん :2005/08/12(金) 19:41:51
>>839
× char* pBuffer;
× char** pBuffer;

842 名前:デフォルトの名無しさん :2005/08/12(金) 19:43:09
char ** pBuffer;

843 名前:デフォルトの名無しさん :2005/08/12(金) 19:43:41
× char* pBuffer;
○ char** pBuffer;

あとstrcpyじゃなくてstrncpy使ったほうがよさげ

更に言うとメモリ管理めんどくさくなりそうだからクラス化しちゃえば・・・?

844 名前:デフォルトの名無しさん :2005/08/12(金) 19:44:35
>>841
どうもありがとうございます m(__)m

>>840
cout << *pBuffer << endl; は
cout << pBuffer[0] << endl; の方が正しいかも

>>842
ああ、すみません。

>>843
うはwwごめんなさい。

845 名前:デフォルトの名無しさん :2005/08/12(金) 19:51:15
関係ないですけど、アスタリスクは

多数派 char* pBuffer
少数派 char *pBuffer
あんま見ない char * pBuffer

なんですね ^^

>>843
今クラス化の途中です。
strncpy()はstrlen()も一緒に使うんでしょか?

846 名前:デフォルトの名無しさん :2005/08/12(金) 19:53:04
>>845
strncpyで指定する長さは確保したサイズであって文字列自体のサイズじゃない
それ以上書くなって意味。buffer overflow予防。

847 名前:デフォルトの名無しさん :2005/08/12(金) 19:54:51
というかstringとvector使えば終了・・・

848 名前:デフォルトの名無しさん :2005/08/12(金) 19:55:14
>>845
俺は本音は少数派で普段は多数派に迎合
メンバポインタとか多数派じゃ無理

849 名前:デフォルトの名無しさん :2005/08/12(金) 20:03:03
>>846
あー、なるほど。納得。

もし>>839のだと、
strncopy(pBuffer[0], "Helo", strlen("Hele") + 1);
って書かなきゃならないから、なんかおかしいと思ったのですが、

strncopy(pBuffer[0], "Helo", 20);
って書けば有事の際にもオーバーフローしなくなりますね。
でもサイズが合わないとヌル文字は入らないとかなんとか・・。

>>847
orz

>>848
迎合てww そですかww

メンバポインタってのはよくわからず。

850 名前:デフォルトの名無しさん :2005/08/12(金) 20:52:14
classの中で実質同じだけど異なる名前の変数を使いたいときってどうするの?

class CCCC
{
int a;
int *a_ailias;
CCCC():a_ailias(&a){}
};
もっとスマートな方法ないのかな

851 名前:デフォルトの名無しさん :2005/08/12(金) 20:57:14
>>849
> strncopy(pBuffer[0], "Helo", strlen("Hele") + 1);
> strncopy(pBuffer[0], "Helo", 20);
まあ、あくまで一例の話だし、細かいこと言うのはアレだけど

char pBuffer[] = "nulupo";
char* src = "Helo";

strncpy(pBuffer, src, (sizeof pBuffer/sizeof pBuffer[0]));

かっちりやるならこうだろ。
pBuffer[0]へコピーとか、"Helo"だの20だのハードコーディングとか、ポインタと配列の区別とか、まあ頑張れ。

ちなみにメンバポインタってのはこういうヤツ。
void (IInterface::*pMethod)() = CSomeClass::someMethod;
(pObj->*pMethod)();

>>850
そんな感じでポインタか参照使うしかないんじゃね?
何がしたいのかにもよるだろうけど。


852 名前:デフォルトの名無しさん :2005/08/12(金) 21:05:07
>>851
>char* src = "Helo";

const付けろよ。

853 名前:デフォルトの名無しさん :2005/08/12(金) 21:42:56 ?
strncpy()は、バッファが足らないときの動作があれなんで、俺は使わない。

854 名前:デフォルトの名無しさん :2005/08/12(金) 22:22:40
そうだな、使うなら、strncpyよりは、snprintfだなぁ。

855 名前:デフォルトの名無しさん :2005/08/12(金) 22:27:36
>>853の言う問題はsnprintfでも解決されないと思うが。

856 名前:デフォルトの名無しさん :2005/08/12(金) 22:40:35
予めバッファの最後に'\0'入れといて、バッファサイズ-1渡せばいいだけじゃん。

857 名前:デフォルトの名無しさん :2005/08/12(金) 22:43:02
>>850
「別名」を使うなら参照(int& a_alias)を使うんじゃないかな。
ポインタでも実質ほとんど変わらないだろうけれど、参照にはNULLがない・参照先は変えられない分すこし安全。


858 名前:デフォルトの名無しさん :2005/08/12(金) 22:49:30
strlcpyを使うのが通

859 名前:デフォルトの名無しさん :2005/08/12(金) 22:54:30
staticで宣言した変数は自分のタイミングで消せる?

860 名前:デフォルトの名無しさん :2005/08/12(金) 22:58:32
>>854
基本的にはsnprintfは失敗すると-1を返すから、それならmalloc(realloc)して
エラー回避できる余地がある、ただ、こういった問題があるが、
ttp://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/dangers-c.html

861 名前:デフォルトの名無しさん :2005/08/12(金) 23:00:55
消せぬ

862 名前:デフォルトの名無しさん :2005/08/12(金) 23:02:05
    _, ,_  パーン
 ( ‘д‘)
  ⊂彡☆static

863 名前:デフォルトの名無しさん :2005/08/12(金) 23:09:04
車輪の再開発なんてしないでstring使えよ

864 名前:デフォルトの名無しさん :2005/08/12(金) 23:11:26 ?
「用意しているバッファより長い文字列がきたら切り捨てる」という処理をする
シュチュエーションがあまりないから、strncpy()はあまり使いどころがないような。
もしそういう処理なら、strncpyを使って、バッファの最後に必ず0を書き込むという
処理でいいかもしれないけど。

バグを利用してスタックを書き換えるとか、セキュリティーを意識して、strncpy()が
推奨されてるのだろうか。

865 名前:デフォルトの名無しさん :2005/08/12(金) 23:12:52
バッファの最後というか、バッファの余りを0で埋める、というのが正確じゃないのかな。

866 名前:デフォルトの名無しさん :2005/08/12(金) 23:18:19
>>859
クラスユニークな変数を臨機応変に生成 / 削除したいなら
static なポインタを定義して new / delete すればええやん
マルチスレッドんときはブロック処理して

867 名前:デフォルトの名無しさん :2005/08/12(金) 23:31:54
>>860
> ttp://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/dangers-c.html

日本語しか読めないとこんな時代遅れの文書をいつまでも
使い続けることになるんだな。かわいそう。


868 名前:デフォルトの名無しさん :2005/08/12(金) 23:38:30
今なら解決してるって安心できるのか?それ

869 名前:デフォルトの名無しさん :2005/08/12(金) 23:41:14
>>867は日本語もろくに使えない池沼
>>867は日本語もろくに使えない池沼
>>867は日本語もろくに使えない池沼
>>867は日本語もろくに使えない池沼

870 名前:デフォルトの名無しさん :2005/08/12(金) 23:45:26
>>867
もう少しトゲのない文章は書けないのかね?

871 名前:デフォルトの名無しさん :2005/08/12(金) 23:46:51
>>867がそれのどこを読んでレスしてるのかがわからんが、
少なくともWIN系ではそのままじゃ使えないな
#define snprintf _snprintf みたいなことをしなきゃならん

872 名前:デフォルトの名無しさん :2005/08/13(土) 00:17:36
strncpy()ってのはいわゆるsubstr()相当の使い方をするものだと思っていた。
string.hって文字列操作用の関数群であって、文字列用バッファ管理をするものではないという認識で居たんだが、プロの世界ではstring.hにあるような関数を直で使ってバッファ操作を行うのか・・・

873 名前:デフォルトの名無しさん :2005/08/13(土) 00:21:59
>strncpy()ってのはいわゆるsubstr()相当の使い方をするものだと思っていた。
その使い方だと、最後にNULが埋まらない場合が多い気がするけど。

874 名前:デフォルトの名無しさん :2005/08/13(土) 07:01:50
クラスA、クラスBがあります。両方ともクラスCから派生しており、
クラスCはメンバ変数としてvoid(*m_pfunc)(int)という関数ポインタを持ち、
Set〜,Get〜という感じでそのポインタのセッターゲッター関数もあります。

クラスAはメンバ変数としてクラスBへのポインタを持っています。
クラスAのコンストラクタでクラスBをnewして、
クラスAのメンバ関数void func(int) へのポインタを
クラスBに渡したいのですが、可能でしょうか?
とすればどう書けばよいでしょうか。教えてください。

875 名前:デフォルトの名無しさん :2005/08/13(土) 07:19:40
>>874
メンバ関数 void func(int) へのポインタは void (*m_pfunc)(int) とは型が違うぞ。
それ以外の情報は関係ない。型をあわせない限り無理。

876 名前:デフォルトの名無しさん :2005/08/13(土) 07:24:53
>>875
戻り値voidで引数intな型の関数(とそのポインタ)のつもりだったんですけど、
どう違いますでしょうか。

877 名前:デフォルトの名無しさん :2005/08/13(土) 07:30:51
メンバ関数とそれ以外の関数という点が違う

878 名前:デフォルトの名無しさん :2005/08/13(土) 07:42:10
その違いが分からないので渡し方が分からずに質問している次第であります。

879 名前:デフォルトの名無しさん :2005/08/13(土) 07:51:52
普段は外の(グローバルな?)関数へのポインタを渡して使っているのですが、
クラスA内で生成するクラスBの、このインスタンスには
特別にクラスAのメンバ関数へのポインタを渡したいのです。
メンバ関数と外の関数の両方に対応させるというのは不可能な事なのでしょうか?

880 名前:デフォルトの名無しさん :2005/08/13(土) 08:06:11
不可能です

881 名前:デフォルトの名無しさん :2005/08/13(土) 08:17:37
マジですか。
メンバ関数へのポインタってのは取れないんですか?
クラスごとにそれぞれ.cppと.hファイルを作ってるんですが、
クラスAの定義の外側に普通の関数として書いてそのポインタを渡せば
とりあえず目的は達成できると思いますが、なんか汚いというか気持ち悪いです。
こういったケースの場合どうするのがいいでしょうか。

882 名前:デフォルトの名無しさん :2005/08/13(土) 08:24:39
>>874
void(A::*m_pfunc)(int)
この場合、C の宣言に A が出てくることになるが、いいのか?
メンバ関数へのポインタは普通のポインタの逆でアップキャストができない

883 名前:デフォルトの名無しさん :2005/08/13(土) 08:47:07
>>881
メンバ関数ポインタの使用に固執するなら、まあ、クラスBにクラスAの
メンバ関数ポインタ型のメンバと、それを初期化するコンストラクタを書く
のがまともな手だとおもうが

それがいやなら、静的メンバ関数は、通常の関数ポインタに渡せるから、
そこら辺で妥協すれば?

884 名前:デフォルトの名無しさん :2005/08/13(土) 09:22:41
メンバ関数はやめて、、代わりにメンバに関数オブジェクトを持ったら?

885 名前:デフォルトの名無しさん :2005/08/13(土) 12:46:39
>881
>クラスAの定義の外側に普通の関数として書いてそのポインタを渡せば
それで済むようなものは非静的メンバ関数である必要はないんじゃないか?
つまり >883
>それがいやなら、静的メンバ関数は、通常の関数ポインタに渡せるから、
>そこら辺で妥協すれば?

886 名前:デフォルトの名無しさん :2005/08/13(土) 12:55:47
いろいろありがとうございます。

>>885
一応クラスで全部ラッピングしたいのと(一個だけ外にあると気持ち悪い)、
ライブラリっぽくしたいので、グローバルな関数を使用して
それを外からよばれたりすると困らないかなと思いまして。
staticな関数にするとstaticなメンバにしかアクセスできないし、
この関数一つのためにクラスBにAの宣言を書くのも気持ち悪いなと。。。
グローバルにしながら外から呼べなくする方法というのはありますでしょうか?
(今は関数オブジェクトというのについて調べてます)

887 名前:デフォルトの名無しさん :2005/08/13(土) 14:36:00
別に B に A の宣言が入ってる必要も operator () () も必要ないやん

template <typename T> struct C { void (T::*m_pfunc)(); };
template <typename T> struct B : C<T> { };
struct A : C<A>
{
B<A>* b;
A()
{
b = new B<A>;
b->m_pfunc = &A::func;
}
void func() { }
};

888 名前:デフォルトの名無しさん :2005/08/13(土) 15:02:30
>>886
関数ポインタとメンバ関数ポインタの違いとか、
>staticな関数にするとstaticなメンバにしかアクセスできないし、
の理由とか、分かっているのかな。
関数オブジェクトについて調べるより、そっちの方が先だと思う。
その辺が分かれば答えは自ずと見えてくると思うんだけど……。

こういうのって色々やり方があって、状況に応じて使い分けているから
一概にこれ、とは言いづらいんじゃない?

>>887
>>879
>普段は外の(グローバルな?)関数へのポインタを渡して使っているのですが、
>..snip..
>メンバ関数と外の関数の両方に対応させるというのは不可能な事なのでしょうか?
らしいよ。

#Boost.Functionと言いたくても我慢してる自分


889 名前:デフォルトの名無しさん :2005/08/13(土) 16:05:57
関数オブジェクトにするにしても、クラスCのメンバ変数1つに格納するんじゃ、
二工夫ぐらい必要だし、キャスト必至で使いにくそう

890 名前:デフォルトの名無しさん :2005/08/13(土) 17:15:01
>>874
というわけで、関数オブジェクトならぬ関数ホルダーを使った実装w
本質的に無関係なんで、AのB型ポインタ・メンバはオブジェクトに変えさせてもらった
これで要望は満たしていると思うが、いかがか?
VC++7.1 で確認済み

#include <iostream>
#include <memory>

struct FuncHolderBase { virtual FuncHolderBase* clone() const = 0; };
template<typename Func>
class FuncHolder : public FuncHolderBase {
    Func func_;
public:
    FuncHolder(Func f) : func_(f) {}
    FuncHolder<Func>* clone() const { return new FuncHolder<Func>(func_); }
    operator Func() { return func_; }
};

(続く)

891 名前:デフォルトの名無しさん :2005/08/13(土) 17:16:06
class C {
    std::auto_ptr<FuncHolderBase> fb_;
    typedef void(*Func)(int);
public:
    void set(Func f) { fb_.reset(new FuncHolder<Func>(f)); }
    void set(FuncHolderBase const& fb) { fb_.reset(fb.clone()); }
    template<typename T> T& get() { return static_cast<T&>(*fb_); }
    FuncHolder<Func>& get() { return get<FuncHolder<Func> >(); }
};
struct B : public C {};
class A : public C {
    typedef void(A::*MF)(int);
    B b_;
    void print(int n) { std::cout << "Member: " << n << std::endl; }
public:
    A() { b_.set(FuncHolder<MF>(&A::print)); }
    void foo(int n) {
        (this->*b_.get<FuncHolder<MF> >())(n);     }
};

void print(int n) { std::cout << "Normal: " << n << std::endl; }
int main()
{

    B b; b.set(&print); b.get()(1);

    A a; a.foo(2);

}


892 名前:890 :2005/08/13(土) 18:18:07
「導出」という言葉を思い出してちょっといじったら、もっとシンプルになりやがりました
テンプレートって侮れねえ.....orz

893 名前:874 :2005/08/13(土) 20:55:56
皆さんいろいろありがとうございました。
ちょっと今の自分のレベルだと難しそうなので、
とりあえずきれいではない方法でベタに書いておきます。
いろいろキーワードを頂いたので、もうちょっとレベルが上がったら
見れるようにログを保存しとこうと思います。
>>892よかったらあとで参考にしたいので教えてください。)
ありがとうございました。

894 名前:892 :2005/08/13(土) 21:59:31
>>893
じゃあ、挙げとく

struct FuncHolderBase {};
template<typename Func>
class FuncHolder : public FuncHolderBase {
    Func func_;
public:
    FuncHolder(Func f) : func_(f) {}
    operator Func() { return func_; }
};

class C {
    std::auto_ptr<FuncHolderBase> fb_;
    typedef void(*Func)(int);
public:
    template<typename T>
    void set(T f) { fb_.reset(new FuncHolder<T>(f)); }
    template<typename T> T get() { return static_cast<FuncHolder<T>&>(*fb_); }
    Func get() { return get<Func>(); }
};

class A : public C {
    typedef void(A::*MF)(int);
    B b_;
    void print(int n) { std::cout << "Member: " << n << std::endl; }
public:
    A() { b_.set(&A::print); }
    void foo(int n) {    (this->*b_.get<MF>())(n); }
};

後は890-891と同じ

895 名前:874 :2005/08/14(日) 10:07:57
>>894
ありがとうございました。まだ意味もよく分からぬままですが
とりあえずいじってみようと思ってコンパイルしてみたところエラーが出ました。
VC6++なんですが、なんかコンパイラの原因でしょうか。

error C2275: 'C::Func' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
error C2059: 構文エラー : ')'
error C2783: 'T __thiscall C::get(void)' : 'T' 用のテンプレートの引数を減少できませんでした。
warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。

896 名前:デフォルトの名無しさん :2005/08/14(日) 10:10:42
VC6.0 は、糞

897 名前:デフォルトの名無しさん :2005/08/14(日) 10:11:12
>>896
るせーToolkit使ってるおれはどうなる

898 名前:デフォルトの名無しさん :2005/08/14(日) 10:31:46
VC6 くらいでガタガタ騒ぐ奴こそ世間を知らなさすぎる甘ちゃんだ

899 名前:デフォルトの名無しさん :2005/08/14(日) 10:48:24
むしろそれこそが
世間の端っこにばかり居て中道の感覚を知らない
うらぶれたおっさんの言動w

900 名前:デフォルトの名無しさん :2005/08/14(日) 11:14:50
企業だと、普通にVC++6.0使ってるけどね。
下手するとVC++5.0使っている場合もあるよ。

901 名前:デフォルトの名無しさん :2005/08/14(日) 11:47:02
でも糞は糞。糞だと理解しながら何とか使っていくのがプロ。
使っているからって糞じゃないとか言い出すのは、日々の土方労働で
感覚がすっかりズレてしまった阿呆。

902 名前:デフォルトの名無しさん :2005/08/14(日) 11:49:07
そして皆分かりきっていることを得意げに脊髄レスしてスレの方向をずらす阿呆>>896

903 名前:874 :2005/08/14(日) 11:52:01
つまり、新バージョンを買えということでしょうか?
コンパイラの問題だから修正しようがない、ってことでOKですか?

904 名前:デフォルトの名無しさん :2005/08/14(日) 12:02:25
>901 がプロらしいから、>895 に答えてあげて欲しいな。

905 名前:デフォルトの名無しさん :2005/08/14(日) 12:04:53
VCTK落としてコンパイラだけ差し替えれ。
あ、デバッガ使えなくなるんだっけ?覚えてないけど。

906 名前:デフォルトの名無しさん :2005/08/14(日) 12:21:08
コンパイラをコードに合わせるかコードをコンパイラに合わせるかの問題だから
財布と相談しろとしか言いようがない。

907 名前:874 :2005/08/14(日) 12:29:02
VC6用に書き換えるとしたらどうなるんでしょうか。
なにが引っかかってエラーになってるのか分からないんですが。

908 名前:デフォルトの名無しさん :2005/08/14(日) 12:31:33
WindProcごときでいつまでもグダグダいってんじゃねぇ。

909 名前:デフォルトの名無しさん :2005/08/14(日) 14:13:45
いつのまにかboost-1.33が出てるじゃん
それにサイトもリニューアルしてるし

910 名前:デフォルトの名無しさん :2005/08/14(日) 14:21:21
>>903
違う
あなたが悩んでいることは純粋に設計の問題であって
コンパイラのバージョンは関係ない

何をどうしたいのかを、まずはっきりさせなさい

それでもし書けないことがあったら、
本質的に無理なことか、そうではないかをはっきりさせなさい
本質的に無理なこととは、アセンブラでもハードでも絶対に無理なことを言う

911 名前:874 :2005/08/14(日) 15:08:39
↑とりあえず、「なさい」じゃねーよ。
教える立場、教えてもらう立場って前にあかの他人同士だっていう関係性を忘れんな。
テメェが威張る場面じゃねーんだよ。
偉そうな事抜かす前に話の流れくらい読んでから書き込めや糞馬鹿が。

912 名前:デフォルトの名無しさん :2005/08/14(日) 15:20:26
夏ですね〜^^

913 名前:デフォルトの名無しさん :2005/08/14(日) 15:30:54
駄目だこりゃ

914 名前:デフォルトの名無しさん :2005/08/14(日) 15:56:50
感動してしまった

915 名前:デフォルトの名無しさん :2005/08/14(日) 15:57:56
夏だね〜

916 名前:デフォルトの名無しさん :2005/08/14(日) 16:16:38
流石に騙りだろ?

917 名前:デフォルトの名無しさん :2005/08/14(日) 16:32:42
もう死にたい

918 名前:874 :2005/08/14(日) 16:51:53
コンパイラの問題らしいので別スレで聞いてきました。すいません。

919 名前:デフォルトの名無しさん :2005/08/14(日) 17:31:30
>>902
わからない人がいるみたいだから
説明してあげたんですよ。

もうわかりましたか?

920 名前:デフォルトの名無しさん :2005/08/14(日) 18:21:39
>>919
何も説明してないじゃん
これだから池沼は困る

921 名前:デフォルトの名無しさん :2005/08/14(日) 19:40:23
あ、本物のキチガイさんでしたか。

早くよくなってくださいね。

922 名前:デフォルトの名無しさん :2005/08/14(日) 19:44:46
こんにちは、よろしくお願いいたします。
char *a;//char型のポインタにはいったもじを
string aa;//string型の変数に代入したいのですが、
どうすればよいのでしょうか。
for(int i = 0;i<sizeof(a);i++){
aa += *a;
a++;
}
このようにすると、
仲良し 織
では、仲良 しか、はいりません。

923 名前:デフォルトの名無しさん :2005/08/14(日) 19:58:36
aa = a;

924 名前:デフォルトの名無しさん :2005/08/14(日) 20:05:44
色々マニアックなやり方してますね^^

925 名前:デフォルトの名無しさん :2005/08/14(日) 20:15:03
std::wstringをstringとかchar* の文字列に変換したいのですが
どうしたらよいでしょうか。

926 名前:925 :2005/08/14(日) 20:44:28
STLスレがありましたので逝って来ます。

927 名前:785 :2005/08/14(日) 21:46:12
>>785
ISOイメージ版をDLして
Daemon Toolsでマウントしてインストールしたとです
(FULL DONWLOAD版は使用方法不明)

928 名前:デフォルトの名無しさん :2005/08/14(日) 21:59:58
>>923さんありがとうございまいた
できました。
>>924さん
そうですね。とてもへんなことしてたのですね。

929 名前:デフォルトの名無しさん :2005/08/14(日) 23:00:36
VC++2003はシェアウェアをつくってもいいのですか?

930 名前:デフォルトの名無しさん :2005/08/14(日) 23:04:37
>>929
どのバージョン?

931 名前:デフォルトの名無しさん :2005/08/14(日) 23:09:16
>>930
standardです

932 名前:デフォルトの名無しさん :2005/08/14(日) 23:20:01
>>931
いいんじゃね?

933 名前:デフォルトの名無しさん :2005/08/14(日) 23:24:27
まじですか
サポートに電話して聞いても詳しく教えてくれなかったので・・・
明日買ってきます

934 名前:デフォルトの名無しさん :2005/08/14(日) 23:35:46
>>933
どこにかけたんだ? MSのサポートはちゃんとそーゆー事にも答えてくれるぞ。

935 名前:デフォルトの名無しさん :2005/08/14(日) 23:39:50
あ、でも、同じ番号にかけても馬鹿がでた場合はダメダメだったりするから、そーゆーこともあるかwwww

936 名前:デフォルトの名無しさん :2005/08/14(日) 23:42:31
MSマンセーキタコレ

937 名前:デフォルトの名無しさん :2005/08/14(日) 23:44:21
>>934
MSへですよ
うーん、電話の内容をここに転載してもいいのでしょうか?
一言一句正しく書かないと怖いことになりそうです

938 名前:デフォルトの名無しさん :2005/08/14(日) 23:47:31
よろしく

939 名前:デフォルトの名無しさん :2005/08/14(日) 23:53:05
>>937
いらない。スレ違い。
やるならどっか他所でやれ。

940 名前:デフォルトの名無しさん :2005/08/15(月) 02:01:50
PS2のソフトを作りたいのですけど、さんこうになるHPしりませんか?

941 名前:デフォルトの名無しさん :2005/08/15(月) 02:27:21
>>940
IBM PS/2のソフトならTurboC++1.0でも落としてくれば?

942 名前:デフォルトの名無しさん :2005/08/15(月) 02:31:33
プレステ用って、ソニーと契約した会社にだけ
SDKとかが供給されるんでなかったか?違ったかな?


943 名前:デフォルトの名無しさん :2005/08/15(月) 02:36:42
PS2 Linux使えば一応一般人でもPS2用プログラムは作成可能。
つか、あれはドキュメントが全てやけど。

944 名前:デフォルトの名無しさん :2005/08/15(月) 06:49:53
>>940
ttp://page3.auctions.yahoo.co.jp/jp/auction/c104648493
終了してっけど。

945 名前:デフォルトの名無しさん :2005/08/15(月) 07:02:35
これって勝手に売っていいのか?(゚Д゚;)

946 名前:デフォルトの名無しさん :2005/08/15(月) 11:02:08
>>940
http://www.ps2dev.org/
オープンソースのDevelopment Kitがある。

947 名前:デフォルトの名無しさん :2005/08/15(月) 19:16:57
wstringからstringへ変換するために下のようにしたのですが、
思うような結果になりません。「こんにちは」のように全て全角の文字列の場合、
「こんにちは(半角→)ヘヘ・・・・ンンンンンA」のような妙な半角文字が表示されます。
「こaんにちは」などのように途中に半角文字を挟んだり、
全部半角の文字列を渡した場合はうまくいくようです。
どうしたらよいでしょうか。教えてくださいお願いします。

///////////////wstringからstringに変換//////////////
string narrow(const wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
string result = buffer;
delete[] buffer;
return result;
}
////////////main()の先頭でlocale設定////////////////
std::locale::global(std::locale("ja"));
////////////結果テスト//////////////
wstring text;
text = L"こんにちは";
MessageBox(NULL,narrow(text).c_str(),"",MB_OK);

948 名前:デフォルトの名無しさん :2005/08/15(月) 19:23:41
C言語をはじめよう!のひな形が実行できません。
windows.hをインクルードできなくて。同じフォルダにおいても。
untitled.c(1) : fatal error C1083:
Cannot open include file: 'Windows.h': No such file or directory

949 名前:948 :2005/08/15(月) 19:26:30
Includeの中に置いても実行できません
VCTK2003

950 名前:デフォルトの名無しさん :2005/08/15(月) 19:43:32
Platform SDKのLib,includeフォルダをコピーしても
大量のエラー吐きまくりで実行できません。
どういう風にインストールすればいいのか!?

951 名前:デフォルトの名無しさん :2005/08/15(月) 19:52:07
vcvars32.bat SetEnv.bat
開発環境の話はスレ違い

952 名前:デフォルトの名無しさん :2005/08/15(月) 19:55:41
>>948
>C言語をはじめよう!のひな形が実行できません。

ここは C++ スレです

953 名前:デフォルトの名無しさん :2005/08/15(月) 20:12:27
class CommonValue
{...
};

Class MainMethod
{
static CommonValue commonValue;
};
としたいのですが
外部シンボルCommonValue が未解決です
といわれます.
classをstaticに宣言することはできないのでしょうか?

954 名前:デフォルトの名無しさん :2005/08/15(月) 20:16:43
class CommonValue
{...
};
Class MainMethod
{
static CommonValue commonValue;
};
CommonValue MainMethod::commonValue;

説明は有料です

955 名前:デフォルトの名無しさん :2005/08/15(月) 20:18:28
>>953
おまいさんが、宣言しかしてなくて定義をしていないからコンパイラ(リンカ)さんが怒るのです。
どっか適当なところに

static MainMethod::CommonValue commonValue;

とかって定義を記述しておきなさい。

956 名前:デフォルトの名無しさん :2005/08/15(月) 20:18:54
>>954
あのー、今日はこれくらいしかもってないんですけど…これで何とか…

             )
             (
         ,,        )      )
         ゙ミ;;;;;,_           (
          ミ;;;;;;;;、;:..,,.,,,,,
          i;i;i;i; '',',;^′..ヽ
          ゙ゞy、、;:..、)  }
           .¨.、,_,,、_,,r_,ノ′
         /;:;":;.:;";i; '',',;;;_~;;;′.ヽ
        ゙{y、、;:...:,:.:.、;:..:,:.:. ._  、}
        ".¨ー=v ''‐ .:v、,,、_,r_,ノ′
       /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ 
       ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._  .、)  、}
       ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′
      /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ
      ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、)  、}
      ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′

957 名前:デフォルトの名無しさん :2005/08/15(月) 20:19:13
あ、static いらねぇや。 orz

958 名前:デフォルトの名無しさん :2005/08/15(月) 20:21:23
↑とりあえず、「なさい」じゃねーよ。
教える立場、教えてもらう立場って前にあかの他人同士だっていう関係性を忘れんな。
テメェが威張る場面じゃねーんだよ。
偉そうな事抜かす前に話の流れくらい読んでから書き込めや糞馬鹿が。

959 名前:デフォルトの名無しさん :2005/08/15(月) 20:23:30
Class MainMethod
{
static CommonValue &commonValue(){
static s_commonValue; return s_commonValue;
}
};
にでもしときんさい。

960 名前:デフォルトの名無しさん :2005/08/15(月) 20:24:01
>>958
>あかの他人同士だっていう関係性を忘れんな。

オマエガナー

961 名前:デフォルトの名無しさん :2005/08/15(月) 20:26:39
>>958
偉そうな事抜かす前に話の流れくらい読んでから書き込めや糞馬鹿が。

962 名前:デフォルトの名無しさん :2005/08/15(月) 20:29:16
つか、おまえらなにそんなに興奮してんの?

963 名前:デフォルトの名無しさん :2005/08/15(月) 20:31:59
興奮してるのは1人だと思うが

964 名前:デフォルトの名無しさん :2005/08/15(月) 20:34:14
そか、失礼。で、>>961はなしてそんなに興奮してんの?

965 名前:デフォルトの名無しさん :2005/08/15(月) 20:34:55
>>947
向こうでlocaleの指摘をした&&cppllのログページを紹介した人間だが。
紹介先のコードが間違ってたみたい。規格を確認したら、wcstombsは
サイズnを指定した場合、「nバイトに達した」または「ナル文字を格納した」
場合にコピーを停止するから、ナル文字まで含めた文字数(つまり
バッファ長)を渡さなくちゃいけないみたい。

std::string narrow(const std::wstring& input) {
    char* buffer = new char[input.size() * MB_CUR_MAX + 1];
    std::wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX + 1);
    std::string result = buffer;
    delete[] buffer;
    return result;
}

966 名前:デフォルトの名無しさん :2005/08/15(月) 20:35:02
最近、全角の句読点を使うようになったようだな

967 名前:965 :2005/08/15(月) 20:52:25
>>947
環境はVisual C++ Toolkit 2003です。一応。
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86

968 名前:デフォルトの名無しさん :2005/08/15(月) 20:53:48
>>964 = >>958

969 名前:デフォルトの名無しさん :2005/08/15(月) 21:06:14
>>958はコピペ

970 名前:947 :2005/08/15(月) 21:08:26
>>965
いろいろありがとうございました。+1したらうまくいきました。
終端NULLの分を含めないといけなかったというのはおかげ様で納得できたのですが、
でもだとするとなんで半角文字含めた文字列を渡したときにうまくいってたんでしょう?

971 名前:デフォルトの名無しさん :2005/08/15(月) 21:21:58
>>970
それは非常に単純。
バッファを全部使い切る前に文字終端に達したと言うだけの話。

972 名前:デフォルトの名無しさん :2005/08/15(月) 21:22:50

VCのwcstrの日本語文字はmbstrに戻すとき、2byte食う。
VCのwcstrの半角英数文字は、mbstrに戻すとき1byteしか食わない(一文字につき1byte分余る)
それだけの話だろう?

973 名前:947 :2005/08/15(月) 21:30:16
>>971-972
そうですね。。。寝ぼけてましたすいません。
ありがとうございました。

974 名前:デフォルトの名無しさん :2005/08/15(月) 22:51:44
次スレ立てた奴の質問に答えてやる
どんなひどい初心者質問でも

975 名前:デフォルトの名無しさん :2005/08/15(月) 22:52:58
むしろ難しい質問の方が困る974であった

976 名前:デフォルトの名無しさん :2005/08/15(月) 23:04:12
じゃあ立ててみますのでしばしお待ちを。

977 名前:デフォルトの名無しさん :2005/08/15(月) 23:04:20
>>974
いま、立てています

978 名前:デフォルトの名無しさん :2005/08/15(月) 23:05:50
C++相談室 part43
http://pc8.2ch.net/test/read.cgi/tech/1124113879/

979 名前:デフォルトの名無しさん :2005/08/15(月) 23:06:52
次スレ番号が43なのについては >>18,25 参照

980 名前:デフォルトの名無しさん :2005/08/16(火) 03:39:51
うめたて

981 名前:デフォルトの名無しさん :2005/08/16(火) 10:24:43
たてうめ

982 名前:デフォルトの名無しさん :2005/08/16(火) 13:07:05


983 名前:デフォルトの名無しさん :2005/08/16(火) 13:52:44
ume

984 名前:デフォルトの名無しさん :2005/08/16(火) 13:56:10
ume

985 名前:デフォルトの名無しさん :2005/08/16(火) 14:01:46
ume

986 名前:デフォルトの名無しさん :2005/08/16(火) 14:21:38
梅子

987 名前:デフォルトの名無しさん :2005/08/16(火) 14:22:40
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ

988 名前:デフォルトの名無しさん :2005/08/16(火) 14:23:09
>>987
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ

989 名前:デフォルトの名無しさん :2005/08/16(火) 14:25:52
template<T>
class ぬるぽ
{};
main()
{ }

990 名前:デフォルトの名無しさん :2005/08/16(火) 14:31:25
>>989
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ

991 名前:デフォルトの名無しさん :2005/08/16(火) 14:33:20
ume

992 名前:デフォルトの名無しさん :2005/08/16(火) 14:50:14
ume

993 名前:デフォルトの名無しさん :2005/08/16(火) 14:53:20
ume

994 名前:デフォルトの名無しさん :2005/08/16(火) 15:08:33
ぬるぽ

995 名前:デフォルトの名無しさん :2005/08/16(火) 15:11:39
ume

996 名前:デフォルトの名無しさん :2005/08/16(火) 15:12:09
>>996
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ

997 名前:デフォルトの名無しさん :2005/08/16(火) 15:12:45
>994
■━⊂( 。・_・) 彡 ガッ☆`Д´)ノ

998 名前:デフォルトの名無しさん :2005/08/16(火) 15:14:47
998

999 名前:デフォルトの名無しさん :2005/08/16(火) 15:16:28
こんな言語勉強すると禿げちゃうよ。

1000 名前:デフォルトの名無しさん :2005/08/16(火) 15:17:30
1000


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.