인프런 커뮤니티 질문&답변

김동훈님의 프로필 이미지
김동훈

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

c++ 구조체 질문

작성

·

205

0

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

struct Node{
    int num;
    vector<int> links;

    
};

Node A[40];

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int num = 2;
    for (int i = 0; i < 19; i++){
        vector<int> v;
        v.push_back(i+1);
        A[i] = {num,v};
        num+=2;
    }
    for (int i = 0; i < 19; i++){
        cout << A[i].num << " ";
    }

}

 

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

struct Node{
    int num;
    vector<int> links;

    Node(int NUM,vector<int> LINKS) : num(NUM),links(LINKS){}
};

Node A[20];

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int num = 2;
    for (int i = 0; i < 19; i++){
        vector<int> v;
        v.push_back(i+1);
        A[i] = Node(num,v);
        num+=2;
    }
    for (int i = 0; i < 19; i++){
        cout << A[i].num << " ";
    }

}

첫번째 코드는 정상작동되는데, 두번째 코드는 error: no matching function for call to ‘Node::Node()’

14 | Node A[20];

이런 오류코드를 띄웁니다.두번째 코드에 이상이 없다고 생각하는데 왜 저런 오류가 나는지 궁금합니다.

 

답변 2

0

김동훈님의 프로필 이미지
김동훈
질문자

이해했습니다! 감사합니다!

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 동훈님 ㅎㅎ

간단하게 이렇게 만드는 것도 괜찮습니다. 이 코드는 생성자 없이 정의하는 코드이고 이 코드를 기반으로 만약 초기화를 한다면 수동으로 다음과 같이 초기화를 해야 합니다.

Node n; n.num = 5; n.links = {1, 2, 3};

struct Node{
    int num;
    vector<int> links; 
};

다만 구조체 - 커스텀 operator를 구현할 경우에는 꼭 이렇게 만들어주셔야 하구요.

struct Point{
    int y, x; 
    Point(int y, int x) : y(y), x(x){}
    Point(){y = -1; x = -1; }
    bool operator < (const Point & a) const{
        if(x == a.x) return y < a.y; 
        return x < a.x; 
    }
}; 

 

동훈님의 에러 코드를 보시면 어떤 매개변수를 받아서 해당 멤버변수를 정하는 constructor가 정의되어있습니다. 이 의미는 앞으로 Node를 생성할 때 생성자를 기반으로 생성한다는 의미입니다.

    Node(int NUM, vector<int> LINKS) : num(NUM), links(LINKS){}

그러나 이부분

 Node A[20];

매개변수가 정해져있지 않고 그저 노드를 생성하는 부분 때문에 에러가 뜨는 것인데요.

생성자(constructor)를 정의했기 때문에 컴파일러는 노드를 생성할 때 생성자부분을 찾습니다.

그러나 생성자에서 매개변수 없이 생성하는 로직 자체가 없기 때문에 에러가 뜨게 됩니다.

a.cpp:24:16: error: no matching constructor for initialization of 'Node'

그렇기 때문에 이렇게 만들어주셔야 합니다.

struct Node {
    int num;
    vector<int> links; 
    Node(int NUM, vector<int> LINKS) : num(NUM), links(LINKS) {} 
    Node() {
        num = 1;
    } 
};

이렇게 하셔도 되고.

struct Node {
    int num;
    vector<int> links; 
    Node(int NUM, vector<int> LINKS) : num(NUM), links(LINKS) {} 
    Node() : num(1), links() {} 
};

이렇게 하셔도 됩니다. 같은 의미입니다.

테스트 코드는 다음과 같습니다.

#include<bits/stdc++.h>

using namespace std;

typedef long long ll; 

struct Node {
    int num;
    vector<int> links; 
    Node(int NUM, vector<int> LINKS) : num(NUM), links(LINKS) {} 
    Node() {
        num = 1;
    } 
};


Node A[40];

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cout << A[0].num << "\n"; 
    cout << A[0].links.size() << "\n"; 
}

 


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

 

김동훈님의 프로필 이미지
김동훈

작성한 질문수

질문하기