Динамическое размещение объекта с перегруженным конструктором в Stack Overflow

Каков синтаксис для динамического выделения объекта с перегруженным конструктором в 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() конструктор.

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

-1

Решение

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

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

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

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

Другие решения

Синтаксис правильный.
Есть много возможностей, так как вы не написали полное определение класса.
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
};
1

Правильный способ — инициализация членов в каждом конструкторе. Вы можете извлечь их общий код в приватную функцию-член 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)
{
...
}
-1
По вопросам рекламы [email protected]