Во-первых, я знаю, что в stackoverflow уже есть подобные вопросы ( this, thisи this ), и поэтому я понимаю причина моей проблемы. К сожалению, это не помогает мне решить эту проблему.
Хотя все приведенные выше вопросы касаются конструктора по умолчанию без параметров, у меня возникла проблема при использовании конструктора с двумя параметрами со значениями по умолчанию— я попытался создать объект, вызывающий конструктор только с задано первое значение, и оно анализируется как объявление функции, а не как объект.
Вот некоторые фрагменты моего кода (я переименовал имена классов, потому что они длинные и неуместные):
class algoContainer{
public:
algoContainer(algo1Virtual &alg1 = algo1Concrete::emptyInstance(),
algo2Virtual &alg2 = algo2Concrete::instance());
someUsefulFunction();
};
class algo1Concrete : public algo1Virtual{
private:
algo1Concrete();
public:
static algo1Concrete &emptyInstance(); // "empty" instance treated
// specifically
// -- uses private no arg constructor
algo1Concrete(const std::vector &myData); // construcotr
};
class algo1Virtual{
// ... all functions virtual, no implementations ...
};
// ... similar for algo2Virtual/Concrete ...
Все функции в классах Concrete
реализованы, в то время как ни одна из них в классах классы Virtual
(кроме конструкторов и деструкторов).
Итак, теперь моя проблема в том, что я хочу сделать что-то вроде :
std::vector workData;
// fill workData
algoContainer myAC(algo1Concrete(workData));
myAC.someUsefulFunction(); // this line gives compile error
Красиво, мило и элегантно, но это не работает (ошибка такая же, как и во всех вопросах, которые я связал ).Я нашел этот форум-туториал, в котором проблема упоминается как самый неприятный анализ, но это решение (заключить аргумент в скобки) не решает проблему (это длинное в этом случае куча сообщений об ошибках, но я могу отредактировать их в вопросе позже, если это поможет - все они связаны с наследованием виртуальной функции).
Я протестировал свой код, если я использую конструктор со всеми параметрами по умолчанию, и даже если я просто создаю первый параметр отдельно:
std::vector workData;
// fill workData
algo1Concrete myA1(workData);
algoContainer myAC(myA1);
myAC.someUsefulFunction(); // now it works fine
algoContainer myAC2;
myAC2.someUsefulFunction(); // this also works
Я могу использовать код как есть, но буду очень благодарен если бы кто-нибудь мог дать мне более элегантное решение, чем то, которое я использую прямо сейчас.
РЕДАКТИРОВАТЬ : сообщения об ошибках, которые я получаю, когда исправляю самый неприятный синтаксический анализ
Если я использую код со скобками:
algoContainer myAC((algo1Concrete(workData)));
Мои ошибки:
/some_path/main.cpp:47:65: error: no matching function for call to ‘algoContainer::algoContainer(algo1Concrete)’
/some_path/main.cpp:47:65: note: candidates are:
/some_path/algo/algocont.h:45:5: note: algoContainer::algoContainer(algo1Virtual&, algo2Virtual&)
/some_path/algo/algocont.h:45:5: note: no known conversion for argument 1 from ‘algo1Concrete’ to ‘algo1Virtual&’
/some_path/algo/algocont.h:36:7: note: algoContainer::algoContainer(const algoContainer&)
/some_path/algo/algocont.h:36:7: note: no known conversion for argument 1 from ‘algo1Concrete’ to ‘const algoContainer&’
Я переименовал пути и вставил пример файла и имена классов (такие же, как выше) для удобства чтения. Просто замечание: строка 45
— это определение рассматриваемого конструктора. С другой стороны, строка 36
— это строка class algoContainer
.
Я также пробовал с этим кодом:
algoContainer myDect((algo1Virtual)(algo1Concrete(workData)));
И тогда ошибки совершенно другие:
/some_path/main.cpp:47:86: error: cannot allocate an object of abstract type ‘algo1Virtual’
/some_path/algo/alg1/algo1virtual.h:31:7: note: because the following virtual functions are pure within ‘algo1Virtual’:
/some_path/algo/alg1/algo1virtual.h:42:8: note: virtual algo1Virtual::~algo1Virtual()
/some_path/algo/alg1/algo1virtual.h:39:18: note: virtual void algo1Virtual::someAlgo1Function(std::vector&)
/some_path/main.cpp:47:87: error: no matching function for call to ‘algoContainer::algoContainer(algo1Virtual)’
/some_path/main.cpp:47:87: note: candidates are:
/some_path/algo/algocont.h:45:5: note: algoContainer::algoContiner(algo1Virtual&, algo2Virtual&)
/some_path/algo/algocont.h:45:5: note: no known conversion for argument 1 from ‘algo1Virtual’ to ‘algo1Virtual&’
/some_path/algo/algocont.h:36:7: note: algo1Virtual::algo1Virtual(const algo1Virtual&)
/some_path/algo/algocont.h:36:7: note: no known conversion for argument 1 from ‘algo1Virtual’ to ‘const algo1Virtual&’
Надеюсь, это поможет.