【问题标题】:trying to call non static function outside class in c++ [closed]试图在 C++ 中的类外调用非静态函数[关闭]
【发布时间】:2022-12-18 21:34:36
【问题描述】:

我正在开发一个加密货币交换模拟器,它从 CSV 文件中读取数据并将它们转换为对象。我有一个名为 orderBook 的课程,它负责阅读。该类的功能之一是 getKnownProducts,它将所有货币打印为字符串。

我想从主 cpp 文件中的另一个函数调用函数 getKnownProducts 以列出所有产品。

    class OrderBook
{
    public:
    /** Construct, reading a csv file*/
        OrderBook(std::string filename);
     /** Return vector of all known products in the dataset*/
        std::vector<std::string> getKnownProducts();
     //some more code...
};

我在主文件中创建了一个实例。 (构造函数确实读取了 CSV 文件,但省略了代码,因为它不相关)

OrderBook orderBook{"20200601.csv"};

这是cpp文件中的实现。

std::vector<std::string> OrderBook::getKnownProducts()
{
    std::vector<std::string> products;

    std::map< std::string, bool> prodMap;

    //OrderBookEntry is a class that has a constructor with the data types required to store the data from the csv file.
    for(OrderBookEntry& e : orders) 
    {
        prodMap[e.product] = true;
    }
    // Flatten map to a vector of strings
    for(const auto& productStringBoolPair : prodMap)
    {
        products.push_back(productStringBoolPair.first);
    }
    return products;
}

最后,当我收到类型名称错误时,我尝试从以下函数调用 getKnownProducts。 vs code 假设我正在使用类调用函数,但我正在使用类的实例来调用函数。我应该怎么做才能说清楚?

void printProducts()
{
    for(std::string const& p : orderBook.getKnownProducts())
    {
        std::cout << "products: " << p << std::endl;
    }
}

【问题讨论】:

  • 你希望它做什么?在没有类实例的情况下调用非静态方法应该意味着什么?您期望成员变量(例如orders)的值神奇地来自哪里?
  • 您需要一个对象来调用成员函数。 OrderBook{"foo"}.getKnownProducts() 在语法上是正确的,但你想做什么不清楚
  • 这是你的问题:OrderBook OrderBook{"20200601.csv"};。不要给变量起与给类相同的名称。在OrderBook ob("xxx"); 周围做某事,然后在for (const auto&amp; p : ob.getKnownProducts()) VTC 打字错误。

标签: c++ class c++11


【解决方案1】:

一种班级就像一个蓝图,它在那里创造实例该类类型的。

您可以创建静态的函数,它们只是附加到该类范围的普通函数,但是任何方法需要调用该类的对象:

class A
{
public:
static void classFunction(){}
void method(){}
};

int main()
{
    A::classFunction(); //That's ok, because it's a static function
    // A::method(); // Not ok, it needs an instance.
    A a; // Here we create an instance of class A
    a.method(); // That's ok, we have an instance.

}

在你的例子中,OrderBook 是一个类名,所以你不能在没有实例的情况下调用方法。

【讨论】:

  • 我确实有一个实例,但它在另一个文件中(这有关系吗?)
  • 实例有一个作用域,即可以访问这个对象的代码。您可以跨文件访问或传递对象(注意:文件!=范围)。尽管使用全局变量是合法的,但这也是一种非常糟糕的做法。所以通常,您会在重要的地方创建一个对象并将其传递给所需的函数/方法。
  • 考虑到你的最后一个问题版本:实例不能与类具有完全相同的名称,这不会编译。
  • 我在这里打错了它实际上是 OrderBook orderBook{ }
  • 我想你现在可以将它 const OrderBook&amp; orderBook 传递给 printProducts 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多