【问题标题】:Abstract functions抽象函数
【发布时间】:2013-04-11 12:40:46
【问题描述】:

我在锻炼时遇到了一点问题。我有 2 节课:

第一个:

namespace Abstract{

    class AbstractClass{
    public:

        virtual void setName(const std::string & _name) =0;
        virtual void print() =0;
        void DynamicCastTest(){};

    };

}

第二个:

class ConcreteClass : public Abstract::AbstractClass{

    std::string type;

public:
    ConcreteClass();
    ConcreteClass(const char* a);
    ~ConcreteClass();

    static Abstract::AbstractClass* CreateConcreteClass(const char* a);

    virtual void setName(const std::string & _name); 
    virtual void print(); 

};

还有第二类的cpp文件:

#include "concreteClass.h"

ConcreteClass::ConcreteClass(){
    type = "";
}

ConcreteClass::ConcreteClass(const char* a){
    type = a;
}

ConcreteClass::~ConcreteClass(){}

static ConcreteClass* CreateConcreteClass(const char* a){
    return new ConcreteClass(a);
}

void ConcreteClass::setName(const std::string & _name){
    type = _name;
}

void ConcreteClass::print(){
    std::cout<<type<<std::endl;
}

但在我的主要情况下,当我打电话时:

const char* s = "";
Abstract::AbstractClass* a = ConcreteClass::CreateConcreteClass(s);

在编译中,Visual out me an error LNK2019 :

"public: 静态类 ConcreteClass * __cdecl ConcreteClass::CreateConcreteClass(char const *)" (?CreateConcreteClass@ConcreteClass@@SAPAV1@PBD@Z)

在最后一行。为什么?

【问题讨论】:

  • 错误的标题:这是 C++ 代码,而不是 C !请显示完整的错误信息。
  • 错误所指的“符号”是什么?
  • 已编辑完整的错误代码
  • 为什么第二次问这个问题?

标签: c++ function abstract


【解决方案1】:

啊,明白了:

static ConcreteClass* CreateConcreteClass(const char* a){
    return new ConcreteClass(a);
}

不是以下声明:

ConcreteClass::CreateConcreteClass(s)

我会留给你找出解决方法,因为这是一次很好的学习体验,而且我 100% 确定你不需要练习复制粘贴 - 或者你可以等待,因为我确信其他人很快就会发布“固定”答案,仅仅是因为他们不在乎你是否学习。

编辑:澄清。您已经在类中声明了一个静态成员函数。并且您已经定义了一个不是任何类成员的静态函数。

【讨论】:

  • 不是他们不在乎你学不会,而是他们想要自己的声望点。 +1 为正确方向的温和提示。
  • 嗯,它是一个静态函数,所以我可以使用 'ConcreteClass::' 命名空间调用它,然后函数名称是 'CreateConcreteClass' 所以对我来说这是一个好的声明?
  • 好吧,我想我的答案不会很好,因为我的预测成真了。请随时 CTRL-C + CTRL-V Shafik 的回答。
  • 我认为我们的目标应该是提供答案(或如何解决)并解释它。
  • @sftrabbit:我已经用文字解释修改了我的答案,但不是“可复制粘贴”的答案。
【解决方案2】:

您将CreateConcreateClass 声明为:

   static Abstract::AbstractClass* CreateConcreteClass(const char* a);

但后来我们有了这个,它是一个静态函数,但不是你在类中声明的那个:

static ConcreteClass* CreateConcreteClass(const char* a){
    return new ConcreteClass(a);
}

签名必须与您的声明相匹配,因此应该是这样的:

Abstract::AbstractClass* ConcreteClass::CreateConcreteClass(const char* a){
    return new ConcreteClass(a);
}

【讨论】:

  • 对...声明中不用写静态字了?
  • 问题是Abstract::AbstractClass* ConcreteClass::CreateConcreteClass 不等于static ConcreteClass* CreateConcreteClass 即使没有静态,返回类型也不一样。
  • @PierreBesses 实际上,您的定义中不需要static,但您的声明中确实需要它
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2018-12-02
  • 2015-09-26
  • 2020-07-01
相关资源
最近更新 更多