【发布时间】:2018-03-14 14:14:35
【问题描述】:
我正在开发一个基于模板、STL、命名空间的新应用程序......(我的同事已经采取了所有必要的步骤来搞砸),现在我只想向一个类添加一个属性,并且这不起作用,让我告诉你):
在头文件中:
namespace utils{
class Logging_Manager : public Singleton<Logging_Manager> {
friend Singleton<Logging_Manager>;
Logging_Manager();
private:
std::vector<std::shared_ptr<Single_Logger>> logging_modules;
LogLevelType loglevel; // 0 : no logging, 1 : info logging, (2-4 are not used), 5 : debug, 6 : everything
public:
Timer getDebuggerTimer;
Timer getFileTimer;
我自己刚刚添加了最后一个条目 getDebuggerTimer 和 getFileTimer,但由于编译器错误 C3646 和 C4430,这无法编译。
我的意思是两者都是Timer 类型的属性,我并不是说这些东西是某些方法的模板,这些方法可能是抽象的、虚拟的或其他的,不,它们只是作为属性,不多不少。
由于我没有找到将两个计时器都添加到我的头文件中的方法,我的老板刚刚解决了如下问题:
class Timer; // this class is defined elsewhere, how can it be put here and make things work?
namespace utils{
class Logging_Manager : public Singleton<Logging_Manager> {
friend Singleton<Logging_Manager>;
Logging_Manager();
private:
std::shared_ptr<Timer> getDebuggerTimer;
std::shared_ptr<Timer> getFileTimer;
换句话说:他没有添加包含,但他添加了对标头不知道的内容的引用:class Timer。
在此之上,他添加了一个共享指针,它神奇地做了一些事情。
我完全迷路了:看起来 STL 添加了如下编程规则:
- 如果您想让某些东西起作用,请不要添加包含,而是添加引用(但是您的代码如何知道引用的含义?)
- 您可以添加共享指针(或其他 STL 发明),它们将使您的代码工作。
?????
有人能解释一下吗?
【问题讨论】:
-
C# 背景?我问是因为 C++ 没有定义任何称为“属性”的东西。这可能有助于澄清您要做什么。
-
我很确定这与模板或 STL 无关。
-
这里的 STL 完全是无辜的,我不知道你在抱怨什么。
-
你的老板应该可以简单地回答这个问题。除非他给你不问的理由,否则我会说下次问你老板而不是问我们:-)
-
您实际上缺少大量 C++ 知识,其中包括“如何声明类型”。这整个问题只是将手指指向与缺少的
#include或声明无关的随机特征。因此,VTC“不太可能帮助未来的读者”。在您的辩护中,MSVC 在这种情况下的错误消息非常无用。