• 締切済み

C++でCの構造体をnewするとまずいのでしょうか?

以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >この手の typedef を見るたびに思うんだけど, なんで  ↑  構造体の名前は別々に管理されているので同名を使えます。  きっと違う名前を付けなければいけないと思うのでしょう。    typedef struct 名前1 {  :  } 名前2;    『名前1』と『名前2』は同じでも良いのです。

rotofrot
質問者

お礼

ありがとうございます。 同じ名前でもよいというのを初めて知りました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

基本的には大丈夫だけど強いていえば「__ で始まるタグは避けた方が安全」かな. この手の typedef を見るたびに思うんだけど, なんで typedef struct Test { .... } Test; ってしないのかなぁ?

rotofrot
質問者

お礼

_がついているのはシステム予約されていたりするみたい記述を みかけたことがあります。 回答ありがとうございました。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

特に問題はないと思いますけど。 C++において構造体はクラスの一種です。デフォルトでメンバがpublicになるくらいしか違いはなかったと思います。

rotofrot
質問者

お礼

デフォルトのアクセス指定子がpublicになるだけなのですね。 回答ありがとうございました。

関連するQ&A

  • 構造体の入れ子が構造体の場合のextern宣言について

    えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;; typedef struct __test001 { int arg; } _test001; typedef struct _body { _test001 test001; } body; body useful; この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

  • C++:構造体:newで入れ子:deleteは?

    C++で以下のような構造体を使っています。(本当は他にもメンバが有ります) // ----- typedef struct{  int *npMember; }Test_t; // ----- これをクラスのメンバ変数で // ----- Test_t *m_tpTestStruct; // ----- とし、関数の中で // ----- m_tpTestStruct = new Test_t[10]; for (int i = 0; i < 10; i++) {  m_tpTestStruct[i].npMember = new int[100]; } // ----- というようにメモリを割り当てています。 これを解放する時は、 // ----- for (int i = 0; i < 10; i++) {  delete [] m_tpTestStruct[i].npMember; } delete [] m_tpTestStruct; // ----- で、良いのでしょうか? それとも、他の書き方が必要なのでしょうか?

  • .NET C++で、構造体の配列をnewで作成しようとするとerror C2440のエラーとなってしまいます

    Visual studio2003 .NET C++で、構造体の配列を作成し、 改めて構造体の配列をサイズ指定して作成しようとすると、error C2440が出てしまいます。 ポインターで宣言したつもりはないのですが、ポインターから配列に変換できないといった項目のエラーなので、 なぜこのようなエラーが出るのかわからずにおります。 typedef __nogc struct TEST { // 省略 }; TEST struct_test __nogc[]; int int_num = 10; struct_test = new TEST __nogc[int_num]; // error C2440: '=' : 'TEST *' から 'TEST []' に変換できません。 ご指摘等ありましたらご回答いただけますと助かります。 よろしくお願いいたします。

  • 構造体のリンク?

    こんにちは。 超初心者です。 どうぞよろしくお願いしますm(__)m 下記の三つのファイル、コンパイルすると「パブリックシンボル_high、_lowがi.obj、c.objの両方に定義されている」旨のエラーが出てしまいます。 ヘッダファイルに#ifndef~を書くくらいしか見当がつけられない初心者です(T_T) どこをどう直せばいいのか教えてください。 やりたいことは、high->i+high->j、low->i+low->jを関数一つに纏めて、mainから別ファイルに独立させることです。 *********c.h********* #ifndef __c__ #define __c__ struct type{ int i; int j; }*high,*low; extern int f(struct type *temp); #endif *********c.cpp********* #include"c.h" int f(struct type *temp); int f(struct type *temp){ return temp->i+temp->j; } *********i.cpp********* #include<iostream.h> #include"c.h" void main(void){ high->i=10; high->j=30; low->i=100; low->j=300; cout<<f(high)<<","<<f(low)<<endl; }

  • 構造体

    main.c を分割コンパイルすると次のようにエラーが出ます。 これもどこがいけないのかわかりません^^; 1/2 + 1/3 + ... 1/10 を計算するというものですが,たぶんadd の記述はまちがってるかもしれません。ただそれはきにしないでください。 よろしくおねがいします。 storage size of `a' isn't known storage size of `b' isn't known *****main.c****** #include "fraction.h" int main(){ int i; struct function a, b; a.numerator =1; a.denominator =2; for(i=3;i<11;i++){ b.numerator =1; b.denominator =i; add (&a,&b); } return (0); } *****fraction.h***** struct fraction{ int numerator;//bunsi int denominator;//bunbo }; extern struct fraction *kiyaku(); extern struct fraction *add(); extern void output(); ****sub.c***** struct fraction *add(struct fraction *a,struct fraction *b){ .... .... .... }

  • 構造体についてです。

    typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。

  • C言語の構造体にてバブルソートが上手くいきません‥

    C言語の構造体にてバブルソートが上手くいきません‥ 初めて質問致します。 以下は、構造体で、身長順にバブルソートを行うソース文ですが、 結果表示が、最下部に示したように、 5つのレコードのうち1つが消えてしまい、 残った4つのレコードのうちの1つが重複されて表示されてしまいます。 これが、なかなか解決できません‥。 既に結構調べており、また、早く解決できないといけないこともあり、 すみませんが、回答の形式でお願いできますと大変幸いです。 何卒よろしくお願い致します。 #include<stdio.h> #include<string.h> typedef struct kojin { char name[21]; int length; int weight; }KOJIN; int main(void) { int i, c, j; char buf[4]; KOJIN data[10]; KOJIN *d; printf(

  • 構造体・ビットフィールドのvolatileに関して。

    以下のような構造体があったとする。 -(1) -----------------------------  typedef volatile struct ABC{    char x;    char y;  }stABC; -(2) -----------------------------   typedef struct ABC{    volatile char x;    volatile char y;  }stABC; --------------------------------- ■質問  -------------   stABC abc;   abc.x // ←volatileは有効?   abc.y // ←volatileは有効?  ------------- ・このとき、メンバx,y は(1)/(2)の構造体型宣言どちらでも  同じ意味合いになっているのでしょうか。  ※特に(1)の場合、volatileは有効になっているのでしょうか。 ・ビットフィールド時も同じと考えて問題ないでしょうか。   (1)typedef volatile struct ABC{      char x: 1 ;      char x: 7 ;    }stABC;   (2)typedef struct ABC{      volatile char x: 1 ;      volatile char x: 7 ;    }stABC;

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体のキャスト

    はじめまして。 C言語初心者です。今回の質問は構造体のメンバを他の構造体に格納するときにおきる不可解な現象です。 具体的には、 typedef struct gmsg{ int a; int b; int Dt[4]; }GMSG 上記のDt[4]を以下の構造体に代入していきます。 typedef struct msg{ char a; char b; char c; char d; int e; short f; char g; char h; char i; char j; char k; char l; char m; char n; short o; }MSG この際に以下のような処理を行っています。 この際GMSGを(ポインタ)pt_msgdt,(ポインタ)MSGをpt_SubDtとし、 pt_SubDt->a = (char)(pt_msgdt->Dt[0] ) & 0xFF; pt_SubDt->b = (char)(pt_msgdt->Dt[0] >>8) & 0xFF; pt_SubDt->c = (char)(pt_msgdt->Dt[0] >> 16 ) & 0xff; pt_SubDt->d = (char)(pt_msgdt->Dt[0] >> 24)& 0xff; pt_SubDt->e = (pt_msgdt->Dt[1]) & 0xFFFFFFFF; pt_SubDt->f = (short)(pt_msgdt->Dt[2] & 0xFFFF); pt_SubDt->g = (char)((pt_msgdt->Dt[2] >> 16) & 0xFF); pt_SubDt->h = (char)((pt_msgdt->Dt[2] >> 24 ) & 0xFF); pt_SubDt->i = (char)(pt_msgdt->Dt[3]) & 0xFF; pt_SubDt->j = (char)(pt_msgdt->Dt[3] >> 8) & 0xFF; pt_SubDt->k = (char)(pt_msgdt->Dt[3] >> 16) & 0xFF; pt_SubDt->l = (char)(pt_msgdt->Dt[3] >> 24) & 0xFF; pt_SubDt->m = (char)(pt_msgdt->Dt[4]) & 0xFF; pt_SubDt->n = (char)(pt_msgdt->Dt[4] >> 8) & 0xFF; pt_SubDt->o = (short)(pt_msgdt->Dt[4] >> 16) & 0xFFFF; } しかし処理結果をデバック中にDt[0],Dt[3],Dt[4]の0x79以下のデータはキャストが行いますが,0x80~0xffのデータに関しては4byteになり 0xffffff**といったキャスト結果になってしまいます。 例えると Dt[3]=0x000000f120; 処理結果 h = 0x00 g = 0x00 f = 0xFFFFF120 といった結果になってしまいます。 この結果を0x80以上でもint->char,int->shortのようにキャストく色々な方法を試しましたが、わかりません。 よろしくお願いします。 ちなみにOSはLinux,コンパイラーはC言語で扱っているデータはリトルエンディアンのバイナリデータです。

専門家に質問してみよう