【问题标题】:Derived class's new constructor not building: "overloaded member function not found"派生类的新构造函数未构建:“未找到重载的成员函数”
【发布时间】:2014-03-06 10:23:19
【问题描述】:

我有 2 个派生的类,我希望它们有自己的构造函数,而不是基类。这是标题和 .cpp 以及其他成员函数的剥离。

标题:

#pragma once
#include <SFML/Graphics.hpp>

class TextWrap : public sf::Text
{
public:
    TextWrap() {}
};

class CircleWrap : public sf::CircleShape
{
public:
    CircleWrap() {}
};

这是.cpp:

#pragma once
#include "wrappers.h"
#include "stdafx.h"
#include <SFML/Graphics.hpp>

TextWrap::TextWrap(sf::Font font)
{
    setFont(font);
    setCharacterSize(30);
    setStyle(sf::Text::Bold);
    setColor(sf::Color::White);
}

CircleWrap::CircleWrap(void)
{
    setFillColor(sf::Color::Blue);
    setRadius(25);
    setPointCount(100);
}

当它被构建时,我在 Visual C++ 2010 中收到以下错误:

1>c:\users\joe\documents\visual studio 2010\projects\mouseavoider\mouseavoider\wrappers.cpp(14): error C2511: 'TextWrap::TextWrap(sf::Font)' : overloaded member function not found in 'TextWrap'
1>          c:\users\joe\documents\visual studio 2010\projects\mouseavoider\mouseavoider\wrappers.h(5) : see declaration of 'TextWrap'
1>c:\users\joe\documents\visual studio 2010\projects\mouseavoider\mouseavoider\wrappers.cpp(38): error C2084: function 'CircleWrap::CircleWrap(void)' already has a body
1>          c:\users\joe\documents\visual studio 2010\projects\mouseavoider\mouseavoider\wrappers.h(16) : see previous definition of '{ctor}'

我感觉我的构造函数的语法是错误的......但我不知道为什么。我在网上浏览了教程和示例,但我不知道为什么这不起作用。

编辑:已修复!我混淆了声明和定义,需要自己修复变量声明。

【问题讨论】:

  • 错误非常简单。你已经在你的类定义中有一个定义,但你稍后会重新定义它。除此之外,您定义的参数列表与其原型不同。 CircleWrap 不会出现错误,因为它是无效的。

标签: c++ class inheritance constructor sfml


【解决方案1】:

第一个构造函数中的错误是您声明了一个默认构造函数,而不是一个以sf::Font 作为参数的构造函数。

在第二个构造函数中,您输入了{},这意味着您定义了没有内容的构造函数。 如果你想稍后定义构造函数的主体,你必须在末尾加上一个;

应该是:

class TextWrap : public sf::Text
{
public:
    TextWrap(sf::Font font);
};

class CircleWrap : public sf::CircleShape
{
public:
    CircleWrap();
};

【讨论】:

  • 编辑:这几乎解决了!你是对的,我搞混了,把{}放在声明后面。我已经完成了你所说的更改,现在我收到了'TextWrap' : no appropriate default constructor available
  • 在这种情况下,您应该声明另一个构造函数,例如:TextWrap(){}TextWrap(); 如果您想在 .cpp 文件中实现它
【解决方案2】:

您已重载默认构造函数,但似乎正在访问非默认版本。

【讨论】:

    【解决方案3】:

    头文件应该包含声明而不是定义TextWrap() {} 正在定义一个不带参数且具有空主体的构造函数——大括号是空主体。您的类声明应类似于以下内容:

    class TextWrap : public sf::Text {
    public:
        TextWrap(sf:Font font);
    }
    

    声明/原型中的参数必须与定义(例如,源文件)中的参数匹配,并且声明不应包含空主体。

    【讨论】:

    • 谢谢! xorguy,你已经解决了这个问题......现在我得到'TextWrap' : no appropriate default constructor available,不过......有什么想法吗?我认为我不应该使用默认构造函数。
    • 您是在声明一个静态分配的TextWrap 实例(例如TextWrap foo; 而不是TextWrap foo(font)TextWrap *foo;)还是创建一个TextWrap 实例的STL 容器(例如std::vector&lt;TextWrap&gt; ) 需要一个默认构造函数?将错误消息添加到您的问题中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2014-10-24
    • 1970-01-01
    • 2018-07-16
    • 2016-07-19
    • 2018-07-21
    • 2014-01-21
    • 2011-09-17
    相关资源
    最近更新 更多