Динамическое выделение объекта с перегруженным конструктором в C++ [закрыто]

StackOverflow https://stackoverflow.com//questions/22067693

Вопрос

Каков синтаксис динамического выделения объекта с помощью перегруженного конструктора в C++?

Если у меня есть класс Foo:

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

И второй класс Foo2 (с использованием Foo):

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

Отображается следующая ошибка:

нет соответствующей функции для вызова «Foo::Foo()»

Как я могу при создании указателя объекта myFoo указать, что он будет использовать Foo(string str, int nbr) конструктор, не Foo() конструктор.

Возможно ли это без использования делегирования конструктора?

Это было полезно?

Решение

Ваш синтаксис для создания объекта правильный.

Трудно сказать наверняка, поскольку вы не сообщили об ошибке, но я предполагаю, что ваша проблема в том, что конструктор частный.Это означает, что вы не можете использовать конструктор вне класса.

Изменить сообщение об ошибке:

Вот полный пример, который компилируется.Я добавил несколько примеров строк, которые могут вызвать ошибку:нет соответствующей функции для вызова Foo::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
}

Учитывая ошибку, ваш код пытается использовать конструктор по умолчанию. где-то.

Edit2 относительно вашего нового Foo2 пример.Ваше объявление Foo* и вызов конструктора по-прежнему верны, и код должен скомпилироваться, если вы исправите видимость метода и пропустите точки с запятой.Следующий пример компилируется:

#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.проверьте, записан ли cnstsructor по умолчанию.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
};

Правильный способ — инициализировать члены в каждом конструкторе.Вы можете извлечь их общий код в приватную функцию-член init() и вызывать ее в каждом конструкторе следующим образом:

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