【问题标题】:Passing unknown amount of arguments to constructor将未知数量的参数传递给构造函数
【发布时间】:2015-09-14 16:39:46
【问题描述】:

我正在创建一个类,它接收未知数量的对象,然后将它们绘制在屏幕上。

我正在尝试使用模板,但不知道它们是如何工作的,到目前为止,我阅读的每个资源都显示了不同的编写方式。

.cpp

// file composite.cpp

#include <SFML/Graphics.hpp>
#include "composite.h"
#include "copy.h"

template<typename arguments> class drawable
composite<arguments>::composite() {
    drawable<arguments> shape;
}

void draw(sf::RenderWindow & window, sf::Vector2f position) {
    for (int i = 0; i < 10; ++i) {
        //if (parts[i] != NULL) {
            // Draw part
            //parts[i].draw();
        //}
    }
}

.hpp

// file composite.hpp

#ifndef _COMPOSITE_HPP
#define _COMPOSITE_HPP

#include <SFML/Graphics.hpp>
#include "drawable.h"
#include "copy.h"

template<typename arguments>
class composite : public drawable {
public:
    composite<arguments>::composite();
    void draw(sf::RenderWindow & window, sf::Vector2f position) {};
private:
    copy *shape1, *shape2, *shape3;
    copy *parts[10];
};

#endif

现在我收到类似“错误 C2514: 'composite' : class has no constructors”之类的错误,但我很确定我已经为该类创建了一个构造函数。

我做错了什么?

【问题讨论】:

  • 我认为你应该得到比这更多的错误。 composite.cpp 中的构造函数定义在语法上看起来不正确。此外,请编辑您的问题以显示发生错误的代码(即您创建 composite 对象的位置)以及 completeunedited 构建日志。
  • @JoachimPileborg 是的,但是模板的定义真的正确吗?
  • 你想用template&lt;typename arguments&gt; class drawable composite&lt;arguments&gt;::composite(){...}做什么?
  • @jaggedSpire 我想创建一个带有可变数量参数的构造函数。
  • 好吧,那没问题。你没有时间学习如何做某事,而你需要去做。结论很明显:你会失败。没关系(至少在这结束时)。我仍然建议尝试学习如何做到这一点,而不是四处乱窜。链接的资源确实试图教你如何去做。如果您没有时间阅读它们,那意味着您没有时间解决您的问题!

标签: c++ templates sfml


【解决方案1】:

我做错了什么?

我认为您试图过度简化代码以获得一些重要的东西,您应该重新研究。

很容易将其他人的模板用于他们设计的确切内容(例如 std::vector)。设计自己的模板更加困难。如果您以前做过简单的模板,我不确定这个问题中的代码。您的代码没有表现出对使用模板实现参数化类的概念的理解,这比将多个参数传递给构造函数的概念更基本。

【讨论】:

    【解决方案2】:

    如果您想要一个接受多个参数的函数,也许这可以帮助您:

    template <typename... Args>
    void function(Args&&... args) {
    //Do something with args or forward it.. 
    //(std::forward<Args>(args)...);
    }
    

    P.D.也许您应该更好地解释您的问题以获得更好的答案。

    【讨论】:

      【解决方案3】:

      我找到了解决问题的方法。 如果我想要一个带有一组可变参数的构造函数,我应该执行以下操作:

      cpp

      composite::composite(drawable &copy1, drawable &copy2, drawable &copy3){}
      

      hpp

      composite::composite(drawable &copy1 = nullptr, drawable &copy2 = nullptr, drawable &copy3 = nullptr)
      

      这样我可以用 0..3 个参数调用构造函数(在实际赋值中它是 0..10,但我在这里把它变小了,因为它只是一个示例)。

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多