派生构造函数的意外参数错误

问题描述

我正在尝试学习 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;
}

代码中我没有将 Product 指针传递给构造函数

我希望你们中的一些人能在这方面启发我:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)