C ++의 구조 생성자?
struct
C ++로 생성자를 가질 수 있습니까 ?
이 문제를 해결하려고 노력했지만 구문이 표시되지 않습니다.
C ++에서 a class
와 a 의 유일한 차이점은 struct
멤버와 기본 클래스는 기본적으로 클래스에서 비공개 인 반면 기본적으로 구조체에서는 공개입니다.
따라서 구조체에는 생성자가있을 수 있으며 구문은 클래스와 동일합니다.
struct TestStruct {
int id;
TestStruct() : id(42)
{
}
};
위의 모든 답변은 기술적으로 asker의 질문에 대답하지만 문제가 발생할 수 있다고 생각합니다.
구조체를 다음과 같이 선언하면 :
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
}
};
하나 이상의 흥미로운 차이점이 있습니다 (적어도 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 ++ 구조체 및 C ++ 클래스는 기본 구조체 회원들만 한 차이가 공개되며 클래스 회원은 개인이다.
/*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;
}
C ++에서 모두 struct
& class
제외하고는 동일한 struct's
기본 멤버 액세스 지정자 것은 public
및 클래스가있다 private
.
struct
C ++에 있는 이유 는 C ++이기 때문에 C의 상위 집합이므로 이전 버전과 호환 가능해야합니다 legacy C types
.
예를 들어 언어 사용자가 legacy-c.h
자신의 C ++ 코드에 C 헤더 파일을 포함하려고하면 포함 되어 있습니다 struct Test {int x,y};
. struct Test
C처럼 멤버에 액세스 할 수 있어야합니다.
예. 여기에 생성자를 구조로 가질 수 있습니다.
#include<iostream.h>
struct a {
int x;
a(){x=100;}
};
int main() {
struct a a1;
getch();
}
구문은 C ++의 클래스와 동일합니다. C ++에서 생성자를 만드는 것을 알고 있다면 구조체와 동일합니다.
struct Date
{
int day;
Date(int d)
{
day = d;
}
void printDay()
{
cout << "day " << day << endl;
}
};
Struct는 모든 것을 C ++의 클래스로 가질 수 있습니다. 앞에서 말했듯이 기본적으로 C ++ 멤버는 기본적으로 개인 액세스 권한이 있지만 struct에서는 공개입니다. 그러나 프로그래밍 고려 사항에 따라 데이터 전용 구조에는 struct 키워드를 사용하십시오. 데이터와 함수가 모두있는 객체에는 class 키워드를 사용하십시오.
또 다른 예이지만 생성자에서 값을 설정할 때이 키워드를 사용 하십시오 .
#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 ++에서는 클래스와 마찬가지로 구조체를 선언 / 정의하고 구조체의 생성자 / 소멸자를 정의하고 변수 / 함수를 정의 할 수 있습니다. 유일한 차이점은 정의 된 변수 / 함수의 기본 범위입니다. 위의 차이점 외에도 대부분 구조체를 사용하여 클래스의 기능을 모방 할 수 있어야합니다.
참고 URL : https://stackoverflow.com/questions/1127396/struct-constructor-in-c
'Programming' 카테고리의 다른 글
하나의 명령으로 Git 추가 및 커밋 (0) | 2020.03.05 |
---|---|
활동 컨텍스트 외부에서 startActivity () 호출 (0) | 2020.03.05 |
svn 'out of date'오류를 어떻게 극복합니까? (0) | 2020.03.05 |
"예", "아니오"선택 사항 및 DialogResult로 메시지 상자를 작성하는 방법 (0) | 2020.03.05 |
bash 스크립트에서 타임 스탬프 변수 만들기 (0) | 2020.03.05 |