【问题标题】:Incompatible Declaration in Implementation file in C++C++ 实现文件中的不兼容声明
【发布时间】:2015-02-14 17:56:05
【问题描述】:

我的实验室实现文件中有几个不兼容的声明,我不知道为什么。我还在学习 C++,但我看不出这个问题是什么。基本上,该程序应该做的就是当它的运行结束时吐出一条消息,说明欢迎使用成绩簿并与老师一起说明成绩簿的班级。但是,由于不兼容,我的实现文件中的 set 和 get 语句不允许我编译。我可以使用一些提示谢谢。

这是我所有三个文件的代码:

标题 -

#include <string> 

class GradeBook
{
public:
    explicit GradeBook(std::string);
    void setCourseName(std::string);
    std::string getCourseName() const;
    void displayMessage()const;
    void setInstructorName(std::string);
    std::string getInstructorName() const;
private:
    std::string courseName;
    std::string instructorName;  
};

实现文件-

#include <iostream>
#include "GradeBook.h"
using namespace std;

GradeBook::GradeBook(string name): courseName(name)

{

}

void GradeBook::setCourseName() const
{
    courseName = name;
}

string GradeBook::getCourseName() const 
{
    return courseName;
}

void GradeBook::setInstructorName() const
{
    instructorName = name;
}

string GradeBook::getInstructorName() const
{
    return instructorName;
}
void GradeBook::displayMessage() const
{
    cout << "Welcome to the grade book for\n" << getCourseName() << "with"     << getInstructorName << "!" << endl;
}

主文件-

#include <iostream>
#include "GradeBook.h"
using namespace std;

int main()
{
    GradeBook courseName("COP2224: Intro To C++ Programming");
    GradeBook instructorName("Heidi Gentry Kolen");
}                                                  

【问题讨论】:

  • 错误信息在哪里
  • 如果您花时间将代码简化为最小示例,您自己就会发现错误。
  • 有趣的是这是最小的,从学习的起点开始。是的,它可以简化,但我需要了解更多。
  • @AverageJoe:不,它不是最小的......这是在向 SO 发布新问题之前应该能够达到的最小版本:class GradeBook { public: void setCourseName(std::string name) const { courseName = name; } private: std::string courseName; } all 在头文件中。事实上,这个小程序可能已经向您展示了您需要的内容。

标签: c++ declaration


【解决方案1】:
void setCourseName(std::string);         // declaration in .h
void GradeBook::setCourseName() const    // implementation in .cpp

void setInstructorName(std::string);      // declaration in .h
void GradeBook::setInstructorName() const // implementation in .cpp

看到区别了吗?您的实现缺少 name 参数并且有尾随 const 修饰符。你需要纠正这些错误:

void GradeBook::setCourseName(std::string name)
{
    courseName = name;
}

void GradeBook::setInstructorName(std::string name)
{
    instructorName = name;
}

实现的签名必须与其声明的签名相匹配。

【讨论】:

  • 嗯,我完全没听懂。我很感激。就像我说的我还在学习,但谢谢。
【解决方案2】:
void GradeBook::setCourseName() const
{
    courseName = name;
}

错了。

不仅您错过了与声明中相同的签名

void setCourseName(std::string);

它永远不会作为const 成员函数工作,除非courseName 被声明为mutable。此外,name 也未在此上下文中声明。

我猜这只是一个错字。

【讨论】:

    【解决方案3】:

    声明是:

    void setCourseName(std::string);
    

    在定义中

    void GradeBook::setCourseName() const
    

    不正确

    正确的定义应该是

    void GradeBook::setCourseName(std::string name) 
    

    【讨论】:

    • 正要发表评论,但你明白了:现在你已经删除了const,就像其他答案一样,我赞成。
    • 如果你对 QuestionAndAnswer 投了反对票,也许你可以删除它。
    • @JohnCastleman:我没有对 QuestionAndAnswer 投反对票。
    • 好吧……他的回答不正确,但也没有错到需要投反对票,恕我直言。
    【解决方案4】:

    在 GradeBook 的构造函数之前不需要显式关键字。 删除实现文件中setInstructorName和SetCourseName后面的const修饰符。

    【讨论】:

    • 如何去掉 const 有助于解决问题
    • 删除const 绝对是解决方案的一部分( 不是反对者之一),但explicit 关键字绝对是在那里是有原因的(我认为这实际上是你投票失败的原因)
    • @Sumeet,设置用于更改类字段值的方法。 const 关键字限制类中的任何更改。如果这个例子中的 Set 方法有别的意思,那么,是的,我的回答是没用的。
    • @JohnCastleman,是的,显式关键字不是主要原因。只是顺便说一句。
    • @Summet,哦...我现在明白了。我没有注意到 args 列表。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2016-01-11
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多