使用方法而不是构造函数设置类的一行初始化

时间:2017-08-19 13:55:44

标签: c++ c++11

说我有一个班级Test

class Test {
public:
  int a;

  Test();
  int set(int a);
};

Test::Test() {}

int Test::set(int a) {
  this->a = a;
  return a;
}

这个类的实例可以用这样的值(当然)初始化:

Test t;
t.set(10);

但有没有办法在一行中做到这一点?以下代码

Test t.set(10);

我什么时候想这样做?

我正在使用游戏开发库--SFML - 并将纹理应用于我需要传递对Texture实例的引用的形状,如下所示:

Texture texture;
texture.loadFromFile("mud.png");

rect.setTexture(&texture);

我想创建一个带有一些静态常量的类来定义一些纹理,然后我可以在其他地方使用它。

2 个答案:

答案 0 :(得分:2)

您可以创建辅助生成函数:

auto make_texture_from_file(const std::string& filename) -> Texture
{
    Texture texture;
    texture.loadFromFile(filename); 
    return texture;
}

答案 1 :(得分:1)

我不确定它是否是你试图实现的,但你说“......一个带有一些静态常量定义一些纹理的类......”。所以据我所知,你想要一些初始化静态纹理的方法,它必须在类之外完成。因此,初始化必须一个单一的表达式(可能就是你在“一行”中的意思)。

所以这是我的建议(只是一个例子):

Texture.h

#pragma once

#include <string>

struct Texture
{
    std::string fileName;
    std::string filter;
    std::string wrap;

    Texture& LoadFromFile(const std::string& _fileName)
    {
        fileName = _fileName;
        return *this;
    }

    Texture& Filter(const std::string& _filter)
    {
        filter = _filter;
        return *this;
    }
    Texture& Wrap(const std::string& _wrap)
    {
        wrap = _wrap;
        return *this;
    }
    Texture& Finalize()
    {
        // Some final strokes.
        // Omit this if not needed.
        return *this;
    }
};

的main.cpp

#include <iostream>

#include "Texture.h"

struct Textures
{
    static const Texture bricks;
    static const Texture wood;
};

const Texture Textures::bricks = Texture()
        .LoadFromFile("bricks.png")
        .Filter("GL_LINEAR")
        .Wrap("GL_REPEAT")
        .Finalize();

const Texture Textures::wood = Texture()
        .LoadFromFile("wood.png")
        .Filter("GL_NEAREST")
        .Wrap("GL_REPEAT")
        .Finalize();

int main(int argc, char* argv[])
{
    std::cout << "Image: "  <<  Textures::wood.fileName     << std::endl
              << "Filter: " <<  Textures::wood.filter       << std::endl
              << "Wrap: "   <<  Textures::wood.wrap         << std::endl
                                                            << std::endl
              << "Image: "  <<  Textures::bricks.fileName   << std::endl
              << "Filter: " <<  Textures::bricks.filter     << std::endl
              << "Wrap: "   <<  Textures::bricks.wrap       << std::endl;

    return 0;
}

输出:

Image: wood.png
Filter: GL_NEAREST
Wrap: GL_REPEAT

Image: bricks.png
Filter: GL_LINEAR
Wrap: GL_REPEAT

如果我理解错误或有任何错误,请在评论中告诉我。

编辑:如果一次性纹理副本(应该在此处出现)达到你的加载性能而且Texture类有一个移动构造函数,你只需添加std::move(Texture()...);

const Texture Textures::bricks = std::move(Texture()
        .LoadFromFile("bricks.png")
        .Finalize());

Finalize()可以更改为返回右值引用,然后std::move(...);提到更高的值 - Texture将自动移动:

Texture&& Finalize()
{
    return std::move(*this);
}