문제

오버로드된 생성자를 사용하여 객체를 동적으로 할당하기 위한 구문은 무엇입니까?

나는 클래스 푸가있는 경우:

class Foo{
public:
    Foo(string str, int nbr);    // Overloaded constructor
};

그리고 두 번째 클래스 푸 2(푸 사용):

#include "Foo"
class Foo2{
public:
    Foo* myFoo;    // Wrong!
    Foo2(){
        myFoo = new Foo(myStr, myNbr);
    }
};

표시되는 오류는 다음과 같습니다 :

"푸::푸()"에 대한 호출에 대한 일치 함수가 없습니다.

어떻게,내 푸 개체 포인터를 만들 때,그것을 사용할 것을 지정할 수 있습니까 Foo(string str, int nbr) 생성자가 아니라 Foo() 생성자

생성자 위임을 사용하지 않고 가능합니까?

도움이 되었습니까?

해결책

개체를 구성하는 구문이 정확합니다.

당신이 오류를 말하지 않았기 때문에 확실히 말하기는 어렵지만,내 추측은 당신의 문제는 생성자가 사적.즉,클래스 외부에서 생성자를 사용할 수 없습니다.

오류 메시지에 관한 편집:

여기에 컴파일하는 완전한 예가 있습니다.나는 오류를 생성 할 몇 가지 예제 라인을 추가했습니다:'푸::푸()'에 대한 호출에 대한 일치하는 함수가 없습니다.

#include <string>

class Foo{
public:
    Foo(std::string str, int nbr);
};

// empty definition
Foo::Foo(std::string str, int nbr) {}

// delegating constructor (c++11 feature)
// this would produce error: no matching function for call to 'Foo::Foo()'
//Foo::Foo(std::string str, int nbr) : Foo::Foo() {}

int main() {
    Foo* myFoo;
    myFoo = new Foo("testString", -1); // this is correct
    // trying to construct with default constructor
    //Foo myFoo2; // this would produce error: no matching function for call to 'Foo::Foo()'
    //Foo* myFoo3 = new Foo(); // so would this
}

오류가 발생하면 코드가 기본 생성자를 사용하려고 합니다 어딘가.

새로운 것에 관한 편집 2 Foo2 예.생성자에 대한 호출은 여전히 정확하며 메소드 가시성 및 누락 된 세미콜론을 수정하면 코드가 컴파일되어야합니다.다음 예제 컴파일:

#include <string>

class Foo{
public:
    Foo(std::string str, int nbr);    // Overloaded constructor
};

Foo::Foo(std::string str, int nbr){}

class Foo2{
    Foo* myFoo;    // This is still correct
public:
    Foo2() {
        myFoo = new Foo("", 1);
    }
};

int main() {
    Foo2 foo2;
}

다른 팁

구문이 정확합니다.전체 클래스 정의를 작성하지 않았기 때문에 많은 가능성이 있습니다.1.기본값이 작성되었는지 확인하십시오.2.두 생성자가 공용 섹션 내에 있는지 확인합니다.3.또는 다음과 같이 생성자에 대한 호출을 변경할 수 있습니다,

Foo* myFoo = new Foo("testString", -1);

다음 코드가 작동합니다.

class Foo
{

string str;
int num;
public:
    Foo(string p_str, int nbr):str(p_str),num(nbr){};    // Overloaded constructor
    Foo() {};    // Default constructor
};

올바른 방법은 각 생성자의 멤버를 초기화하는 것입니다.다음과 같이 각 생성자에서 호출할 수 있습니다:

class Foo {
    public:
        Foo(string x);
        Foo(string x, int y);
        ...
    private:
        void init(string x, int y);
};

Foo::Foo(string x)
{
    init(x, int(x) + 3);
    ...
}

Foo::Foo(string x, int y)
{
    init(x, y);
    ...
}

void Foo::init(string x, int y)
{
    ...
} 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top