说我有一个班级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);
我想创建一个带有一些静态常量的类来定义一些纹理,然后我可以在其他地方使用它。
答案 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);
}