struct
はC++でコンストラクタを持つことができますか?
私はこの問題を解決しようとしていますが、構文がわかりません。
C++では、class
とstruct
の唯一の違いは、メンバと基本クラスは、デフォルトではクラス内ではプライベートであるのに対し、構造体ではデフォルトでパブリックであることです。
そのため、構造体はコンストラクタを持つことができ、その構文はクラスの場合と同じです。
struct TestStruct {
int id;
TestStruct() : id(42)
{
}
};
上記のすべての回答は、技術的に質問者の質問に答えるものですが、問題が発生する可能性がある場合を指摘しておきます。
あなたがこのようにあなたの構造体を宣言するならば:
typedef struct{
int x;
foo(){};
} foo;
あなたはコンストラクタを宣言しようとして問題があるでしょう。あなたが実際に "foo"という名前の構造体を宣言していないので、これはもちろんです、あなたは無名の構造体を作成し、それにエイリアス "foo"を割り当てました。これはまた、cppファイルでスコープ演算子を使って "foo"を使用できないことを意味します。
foo.h:
typedef struct{
int x;
void myFunc(int y);
} foo;
foo.cpp:
//<-- This will not work because the struct "foo" was never declared.
void foo::myFunc(int y)
{
//do something...
}
これを修正するには、次のいずれかを実行する必要があります。
struct foo{
int x;
foo(){};
};
またはこれ:
typedef struct foo{
int x;
foo(){};
} foo;
後者が "foo"という構造体を作成し、それにエイリアス "foo"を与えるので、それを参照するときにstruct
キーワードを使用する必要はありません。
はい、しかしあなたがあなたの構造が労働組合の中にあるなら、あなたはできません。クラスと同じです。
struct Example
{
unsigned int mTest;
Example()
{
}
};
共用体は、構造体の中でコンストラクタを許可しません。あなたは結束のコンストラクタを作ることができます。 この質問は労働組合の自明でない構成者に関係しています。
他の答えが述べているように、構造体は基本的にC++のクラスとして扱われます。これにより、構造体をデフォルト値で初期化するために使用できるコンストラクタを持つことができます。以下では、コンストラクターはsz
とb
を引数として取り、他の変数をいくつかのデフォルト値に初期化します。
struct blocknode
{
unsigned int bsize;
bool free;
unsigned char *bptr;
blocknode *next;
blocknode *prev;
blocknode(unsigned int sz, unsigned char *b, bool f = true,
blocknode *p = 0, blocknode *n = 0) :
bsize(sz), free(f), bptr(b), prev(p), next(n) {}
};
使用法:
unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);
はい。構造体はクラスに似ていますが、クラス定義および継承時のデフォルトはpublic:
です。
struct Foo
{
int bar;
Foo(void) :
bar(0)
{
}
}
あなたの他の質問を考えて、私はあなたが いくつかのチュートリアルを読むことを勧めます 。彼らは私達がするより速くそしてより完全にあなたの質問に答えるでしょう。
struct HaveSome
{
int fun;
HaveSome()
{
fun = 69;
}
};
私はむしろコンストラクタの中で初期化したいので、順番を守る必要はありません。
C++の構造体とクラスは同じですが、構造体のメンバはデフォルトでパブリックであるのに対し、クラスのメンバはデフォルトでプライベートです。クラスでできることはすべて、構造体でできることです。
struct Foo
{
Foo()
{
// Initialize Foo
}
};
興味深い違いが1つあります(少なくともMS C++コンパイラとの違い)。
あなたがこのような単純なバニラ構造体を持っているなら
struct MyStruct {
int id;
double x;
double y;
} MYSTRUCT;
それから他のどこかであなたはこのようなオブジェクトの配列を初期化するかもしれません:
MYSTRUCT _pointList[] = {
{ 1, 1.0, 1.0 },
{ 2, 1.0, 2.0 },
{ 3, 2.0, 1.0 }
};
ただし、MyStructに上記のようなユーザー定義コンストラクタを追加するとすぐに、次のようなエラーが発生します。
'MyStruct' : Types with user defined constructors are not aggregate <file and line> : error C2552: '_pointList' : non-aggregates cannot be initialized with initializer list.
だからそれは少なくとも一つの構造体とクラスの間の違いです。この種の初期化はOOの習慣ではありませんが、私がサポートしている従来のWinSDK c ++コードのいたるところに見られます。ちょうどあなたが知っているので...
c ++ struct と c ++ class では、デフォルトではstructメンバーはpublicで、クラスメンバーはprivateです。
/*Here, C++ program constructor in struct*/
#include <iostream>
using namespace std;
struct hello
{
public: //by default also it is public
hello();
~hello();
};
hello::hello()
{
cout<<"calling constructor...!"<<endl;
}
hello::~hello()
{
cout<<"calling destructor...!"<<endl;
}
int main()
{
hello obj; //creating a hello obj, calling hello constructor and destructor
return 0;
}
はい、ここではコンストラクタを構造化することが可能です。
#include<iostream.h>
struct a {
int x;
a(){x=100;}
};
int main() {
struct a a1;
getch();
}
構文はC++のクラスと同じです。 c ++でコンストラクタを作成することを知っているのなら、それはstructでも同じです。
struct Date
{
int day;
Date(int d)
{
day = d;
}
void printDay()
{
cout << "day " << day << endl;
}
};
Structは、すべてのものをc ++のクラスとして持つことができます。前述したように、違いはデフォルトではC++メンバがプライベートアクセス権を持っているということだけですが、それはpublicです。プログラミング上の考慮によりデータのみの構造体にはstructキーワードを使用してください。データと機能の両方を持つオブジェクトにはclassキーワードを使用してください。
C++では、struct
とclass
は、struct's
defaultメンバーアクセス指定子がpublic
で、クラスがprivate
であることを除けば、同等です。
C++でstruct
を使用する理由は、C++がCのスーパーセットであり、legacy C types
と下位互換性があることが必要です。
たとえば、言語ユーザーが自分のC++コードにCヘッダーファイルlegacy-c.h
をインクルードしようとした場合、struct Test {int x,y};
が含まれます。 struct Test
のメンバーはCのようにアクセス可能であるべきです。
もう1つの例ですが、コンストラクタで値を設定するときに this キーワードを使用します。
#include <iostream>
using namespace std;
struct Node {
int value;
Node(int value) {
this->value = value;
}
void print()
{
cout << this->value << endl;
}
};
int main() {
Node n = Node(10);
n.print();
return 0;
}
GCC 8.1.0でコンパイルされています。
C++では、クラスと同じように構造体を宣言/定義し、構造体のコンストラクタ/デストラクタを持ち、その中に変数/関数を定義することができます。唯一の違いは、定義されている変数/関数のデフォルトの有効範囲です。上記の違い以外は、ほとんどの場合、構造体を使用してクラスの機能を模倣できるはずです。