【发布时间】:2020-08-05 15:23:59
【问题描述】:
我正在关注一个与我的代码非常相似但不完全相同的在线教程。我已经对其进行了修改,以便更好地理解它,但是我在从内联函数获取/返回字符串值时遇到了问题。一旦编译器退出最后一个大括号Another.cpp,字符串值就会变为空。
有什么方法可以在不更改文件结构和代码的情况下解决我的问题?特别是,我不想更改 Another.h 的任何内容。请,如果有人可以在这里解释内联函数背后的原因,我将不胜感激。
另一个.h
#pragma once
#include<iostream>
#include"Temple.h"
#include<memory>
namespace NamespaceAn
{
class Test
{
public:
static void Init();
inline static std::shared_ptr<Outside::Inside>& GetString() { return s_String; }
private:
static std::shared_ptr<Outside::Inside> s_String;
};
}
另一个.cpp
#include "Another.h"
#include<string>
namespace NamespaceAn
{
std::shared_ptr<Outside::Inside>Test::s_String;
void Test::Init()
{
//This s_String value is getting disapprear as soon as the compiler get out of the curly bracket
auto s_String = Outside::Inside("asdf");
//below all are commented out for the Another.cpp
//std::string Ast = "asdf";
/*std::string Ast = "asdf";
auto s_String = new Outside::Inside(Ast);*/
/*Outside::Inside* ob = new Outside::Inside(Ast);
auto s_String = &(ob->Get());*/
// ***** Attention ****
//no operator "=" matches the operands and binary '=' no operator found which takes a right-hand ooperand of type std::string*(no acceptable conversion)
//s_String = &(ob->Get());
//auto s_String = Ast;
//auto s_String = Outside::Inside("asdf");
//auto s_String = new Outside::Inside("asdf");
//s_String = reinterpret_cast<Ast>;
//*s_String = &(Outside::Inside("asdf"));
//s_String = reinterpret_cast<Outside::Inside*>(&Outside::Inside("asdf"));
}
}
Temple.h
#pragma once
#include <string>
namespace Outside
{
class Inside
{
std::string m_String = "tesi";
public:
Inside(std::string x)
{
m_String = x;
}
std::string Get()
{
return m_String;
}
/*std::string* m_String;
public:
Inside(std::string &x)
{
m_String = &x;
}
std::string Get()
{
return
*m_String;
}*/
/*template<typename T>
static T Set(T x)
{
return T;
}*/
};
}
main.cpp
#pragma once
#include<iostream>
#include"Another.h"
#include<memory>
int main()
{
NamespaceAn::Test::Init();
/*auto asdf = NamespaceAn::Test::GetString();
std::cout << asdf << std::endl;*/
std::cout << NamespaceAn::Test::GetString();
std::cin.get();
}
额外
在Another.cpp里面,我也试过下面的代码:
std::string Ast = "asdf";
Outside::Inside* ob = new Outside::Inside(Ast);
auto s_String = &(ob->Get());
【问题讨论】:
-
#pragma once在你的main.cpp中很奇怪。 -
我已经删除了它,我忘了补充说我得到了 00000000 作为答案,因为一旦编译器退出 Another.cpp 的最后一个大括号,s_String 值就会变空
-
我认为提供了太多代码,尤其是因为其中大部分都被注释掉了。
-
inline static std::shared_ptr<Outside::Inside>& GetString(...在我看来很奇怪。应该返回std::shared_ptr<Outside::Inside>或Outside::Inside const&或Outside::Inside或std::string。 -
这让我脑洞大开。你能简化一下吗
标签: c++ oop inline-functions