如何解决派生构造函数的意外参数错误
我正在尝试学习 C++ 并制作一个简单的继承及其函数调用示例。
第一个问题出现在我没有为派生类设置默认构造函数时。我的意图是使参数化构造函数成为默认构造函数。但是 VS 调试器一直尖叫着没有默认构造函数。所以我添加了一个void构造函数。
这是我收到以下几行错误的时候:
Factory.cpp
D:\...\14.29.30037\include\xmemory(714,47): error C2664: 'Product::Product(const std::string)': cannot convert argument 1 from 'Product *' to 'const std::string'
D:\...\14.29.30037\include\xmemory(707,1): message : No constructor Could take the source type,or constructor overload resolution was ambiguous
C:\...\Factory\includes\products\Product.h(12,2): message : see declaration of 'Product::Product'
它抛出一个错误,它无法将 Product 指针转换为字符串。 该代码不包含任何试图将指针插入 Product 构造函数的行。 (至少,我不能明确地找到)
有一个基类头。 对于这个抽象类,我没有制作 cpp,因为我知道它是多余的。 另一个类 Product 继承并且问题仍然存在于其构造函数中。
class AbstractProduct
{
public:
AbstractProduct() {}
virtual ~AbstractProduct() {}
virtual std::string getName() { return ""; }
};
class Product: public AbstractProduct
{
private:
bool isVisible = true;
std::string name;
public:
Product(); // VS debugger did not like "= default" and still screamed it is ambiguous.
Product(const std::string prodName);
~Product();
virtual bool GetVisible();
virtual void ToggleVisible();
std::string getName();
};
// implementation in Product.cpp:
Product::Product()
{
}
Product::Product(const std::string prodName) : name(prodName)
{
// I get widely different ways to create this constructor
// ": name(prodName)" next to the parameters
// "name = prodName" inside the function body
// assuming both work.
}
Product::~Product()
{
}
bool Product::GetVisible()
{
return isVisible;
}
void Product::ToggleVisible()
{
isVisible = !isVisible;
}
std::string Product::getName()
{
return name;
}
其余的代码看起来像
包括我正在测试实现的 main()::
class AbstractFactory
{
public:
AbstractFactory() {}
virtual ~AbstractFactory() {}
virtual std::vector<AbstractProduct*> iterProducts() = 0;
};
Factory 继承自 AbstractFactory:
class Factory : public AbstractFactory
{
private:
std::vector<Product> prodList = {};
public:
Factory();
~Factory();
void registerProduct(Product* prod);
// void DeregisterProduct();
void resizeProdList(int newSize) { prodList.resize(newSize); }
int printSize() { return prodList.size(); }
int printCap() { return prodList.capacity(); }
std::vector<AbstractProduct*> iterProducts() override;
};
工厂实施:
Factory::Factory()
{
}
Factory::~Factory()
{
}
void Factory::registerProduct(Product* product) {
prodList.emplace_back(product);
}
std::vector<AbstractProduct*> Factory::iterProducts()
{
// copy the size of the product list and allocate it to a temporary vector.
std::vector<AbstractProduct*> marketProduct;
marketProduct.reserve(prodList.size());
// copy the marketed products into the temporary vector
for (auto prod : prodList)
{
if (prod.GetVisible())
{
marketProduct.emplace_back(&prod);
}
}
marketProduct.shrink_to_fit();
return marketProduct;
}
int main() {
int brManager = 0;
int* brManagerPtr = &brManager;
// a Client contains/owns a Factory instance
Client client = Client(brManagerPtr);
Product product = Product("bottle");
Product* productPtr = &product;
// a Factory registers a product (appends a Product instance into a vector)
client.getFactory().registerProduct(productPtr);
std::cout << client.getFactory().printSize();
std::cout << client.getFactory().printCap();
std::vector<AbstractProduct*> products = client.getFactory().iterProducts();
for (AbstractProduct* item : products)
{
std::cout << item->getName();
}
delete productPtr;
delete brManagerPtr;
}
我希望你们中的一些人能在这方面启发我:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。