【问题标题】:Defining a class in c++在 C++ 中定义一个类
【发布时间】:2013-05-18 08:51:08
【问题描述】:

当我尝试运行这个程序时,我收到一条错误消息:

“致命错误:sales_item.h:没有这样的文件或目录。

#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
std::cin >> book;
std::cout << book << std::endl;
return 0;
}

这是什么意思?我读的书,C++ Primer 5th edition,教会了我以这种方式定义一个类。 这是错的吗? 为什么我不能运行这个程序?

【问题讨论】:

  • 表示找不到sales_item.h文件。那不是标准的标题或任何东西。您可能必须制作它并将其放在同一个文件夹中。
  • 显示你的Sales_item.h文件(可能应该命名为sales_item.hh);还展示你如何编译你的例子,并告诉你正在使用哪个编译器和系统。
  • 这不是类定义。
  • 你创建了sales_item.h 头文件?
  • 如何显示?请详细说明。我对这一切都很陌生。

标签: c++ class error-handling


【解决方案1】:

是的,这是错误的。

假设此代码位于名为 MyFile.cpp 的文件中,那么您的代码假定该类的声明与 MyFile.cpp 源文件位于同一文件夹中的文件 "Sales_item.h" 中。

#include 实际上是一个复制/粘贴指令,它将指定文件的内容复制到当前文件中,然后编译器对其进行编译。现在Sales_item.h文件不存在了,编译器给你一个找不到它的错误。

声明和定义类的正确方法:

#include <iostream>


// #include "Sales_item.h"
// What should be in the "Sales_item.h" file

#include <string>
class Sales_item
{

public:
    Sales_item(std::string itemName) //constructor
    {
        m_Name = itemName;
    };

    const char * GetName()
    {
       return m_Name.c_str();
    }

private: //member variables

    std::string m_Name;
};


// End "Sales_item.h"


int main()
{

    std::string bookName;
    std::cin >> bookName; //requires the user to type a string on the command prompt

    Sales_item book(bookName); //construct the object
    std::cout << book.GetName() << std::endl; // retrieve & print the item name on the command prompt
    return 0;
}

另一点是,在 C++ 中,您的类通常在头文件 (.h/.hpp) 中声明,并在 (.cpp) 文件中定义。在我的示例中,该类在同一个文件中简单地声明和定义。这与您的问题所要求的主题不同,但如果您想了解有关如何在 C++ 中使用良好编码实践进行编码的更多信息,请阅读更多关于 C++ 中“声明与定义”的信息。

最好的方法,但更复杂的是,像这样编写我的示例:https://gist.github.com/jeanmikaell/5636990

对于任何一本书,我建议你在编程之前阅读这个简洁的教程:http://www.cplusplus.com/doc/tutorial/

【讨论】:

  • 我只是将它作为 .cpp 存储在我要运行的代码的目录中吗?
  • 是的,多合一 .cpp 并编译/运行它。但是,使用最佳编码实践,我的示例将编码如下:gist.github.com/jeanmikaell/5636990。对于任何一本书,我建议你在编程之前阅读这个简洁的教程:cplusplus.com/doc/tutorial
【解决方案2】:

这是正确的做法

Sales_item.h

#include <string>
#include <iostream>

class Sales_item {
 public:
     Sales_item(){};
     ~Sales_item(){};
          friend std::istream& operator>> (std::istream &in, Sales_item &si);
            friend std::ostream& operator<< (std::ostream &out, Sales_item &so);
private:
     std::string name;

};

std::istream& operator >> (std::istream &in, Sales_item &si)
{
     in >> si.name;
     return in;
}
std::ostream& operator << (std::ostream &out, Sales_item &so)
{
     out << so.name;
     return out;
}

ma​​in.cpp

#include <iostream>
#include "Sales_item.h"
int main()
{
  Sales_item book;
  std::cin >> book;
  std::cout << book << std::endl;
  return 0;
}

来源:https://sites.google.com/site/ypwangandy/tv

【讨论】:

    【解决方案3】:

    看到这个link

    此链接中的几行:

    如何声明一个类

    类可以在最终使用它们的文件中声明。但是,在单独的文件中定义它们是更好的做法。然后可以在任何新应用程序中轻松地重用这些类。但是,创建和使用 C++ 类实际上有 4 个阶段:

    1. 创建一个包含类声明的头文件
    2. 创建一个包含类的任何功能的 C++ 文件
    3. 从正在开发的 C++ 应用程序调用标头
    4. 编译包含类功能和新应用程序的文件

    【讨论】:

      【解决方案4】:

      这意味着编译器找不到您要求它包含到您正在编译的文件中的名为 Sales_item.h 的文件。

      据推测,本书希望您创建一个具有该名称的文件,并将其保存到存储上述源文件的同一子目录中。

      【讨论】:

      • 嘿,杰瑞!如何创建文件?
      • @judas:您显然跳过了本书的重要部分。也许回过头来回顾一下他们在哪里教过如何做那种事情。
      • @C.朗,我想我没有。只需重新阅读最后几页。与此无关。
      • 有很多tutorials 可用。
      • @judas:这将取决于您使用的编辑器、主机操作系统以及诸如此类的东西——您几乎需要有人看着你的东西告诉你第一次怎么做(或者一本书坚持你以一种特定的方式配置你的系统,并且假设你已经按照它的配置给出了非常具体的指导)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多