我想创建一个可以从我程序中的所有类访问的环境类,但我不想在每次我想从其他类访问其成员时都初始化环境对象。在 C++ 中执行此操作的最佳方法是什么?
我想这样做是因为我让环境对象存储了其他类可能使用的所有配置值。这些值是从多个位置读取的,包括不同的文件。我不想每次在我的类中创建一个新的环境对象时都解析这些文件。
我是C++的新手,我想知道重建/重新初始化对象的最佳方法是什么?我的最小代码如下所示:
typedef boost::shared_ptr<Object> PObject;
int main()
{
PObject SomeObject;
SomeObject = PObject(new Object);
// some code
*SomeObject = Object();
}
Run Code Online (Sandbox Code Playgroud)
我觉得这不是正确的做法.有人能告诉我最好的方法吗?我只是想知道如何重建/重新初始化一个对象.谢谢!
在处理微控制器时,有一些本质上是全局的 - 我正在考虑外围设备,如串行端口或其他接口.还有外围设备不仅是全局的,而且只有一个(并且永远不会有更多) - 如外围控制核心时钟或中断控制器.这些外设确实具有某种全局状态(例如 - 核心时钟被设置为某种东西)并且反向计算这些值是低效的.
如果我希望我的程序很好地面向对象,我很难决定如何处理这些对象...全局变量并不好,这很明显,但我只是不知道(不够经验)我是否应该试图"隐藏"这些东西是全局的事实......例如"cin"或"stdout"也是全局的(让我们忽略这样一个事实:在多线程应用程序中这些通常是特定于线程的)并且没有人隐藏着......让我们坚持使用时钟发生器外设 - 只有一个,所以我可以使用单例反模式(;或者让类静态或者让单个对象全局化(这就是我通常所做的) ,因为这个对象存储了当前时钟设置,所以很多其他东西都需要这个值 - 需要设置RTOS使用的系统定时器,需要为其他外设设置时钟(UART波特率,SPI比特率......) ,需要为外部存储器设置正确的时钟或配置存储器等待状态.这就是我认为的原因 在main()中创建一个对象并将其传递到任何地方会有点麻烦......
我可以编写方法,以便所有"全局"信息都来自外设寄存器(例如核心频率可以从当前的PLL设置反向计算),但这似乎也是一个错误的想法,更不用说创建对象了对于时钟发生器外围设备到处都会看起
当前的时钟设置可以存储在类的静态成员中,但是从这里开始,只有一小步朝向完全静态的类(因为"this"指针对于没有状态的类来说是无用的)...
通常在非面向对象程序中找到的解决方案最接近完全静态类 - 只有对全局变量进行操作的函数.
任何人都有一个很好的想法如何很好地处理这种情况或这个问题是否值得花时间?也许我应该只使用一个全局对象并完成它?(;
当在MSVC 2013,x64 Debug config上运行以下代码时,它会在退出main()函数时显示一个带有此着名错误消息的消息框
"Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.".
Run Code Online (Sandbox Code Playgroud)
我无法回答的问题是:为什么?
请注意,在Release配置上运行时不会出现任何错误消息.(为什么?)
免责声明:这只是一个示例代码,这意味着我试图在其他类(一个基础和几个派生)上使用相同的设计,使用更多的方法和模板参数,并且使用比基本的int*更复杂的数据类型.
#include <iostream>
template <class T>
class base {
public:
base() {
static_cast<T*>(this)->setData();
}
~base() {
static_cast<T*>(this)->destroyData();
}
void print() {
static_cast<T*>(this)->print_int();
}
};
Run Code Online (Sandbox Code Playgroud)
class derived : public base<derived> {
public:
void setData() {
x = new int();
}
void destroyData() {
delete x;
x = nullptr;
}
void print_int() {
std::cout << "x = " << *x << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 我正在生成constexpr std::array一个类的内部constexpr,但我只想在使用该类的所有项目中使用该类的一个实例。
我最初将其设为全局变量,但后来发现,如果我在多个翻译单元中迭代数组,这些全局变量就会重复。然后我尝试使用一个constexpr函数,但我无法拥有static这样一个函数的内部。我使用的是c++14,所以我不能使用变量inline constexpr。变量extern constexpr没有意义,因为如果将声明与定义分开,那么constexpr当只需要一项时,如何以编译时而不是运行时的方式处理这些值?
还有其他选择吗?
编辑:参见https://godbolt.org/z/5PcboYov4
请记住,我没有定义常规变量。我正在定义一个constexpr变量。区别很重要。它被用于非上下文constexpr和constexpr上下文中。
自从我用C++编程以来已经有一段时间了.我试图实现一个单例类,但我得到一个未解析的外部符号.你们能指出解决这个问题吗?提前致谢!
class Singleton
{
Singleton(){}
Singleton(const Singleton & o){}
static Singleton * theInstance;
public:
static Singleton getInstance()
{
if(!theInstance)
Singleton::theInstance = new Singleton();
return * theInstance;
}
};
Run Code Online (Sandbox Code Playgroud)
错误:
错误3错误LNK1120:1个未解析的外部
错误2错误LNK2001:未解析的外部符号
"private: static class Singleton * Singleton::theInstance" (?theInstance@Singleton@@0PAV1@A)
我对OOP的大部分经验来自于Objective-C.在那种语言中,实例和类方法之间有明显的区别.因此,使用单例非常容易,没有任何副作用.
在C++我没有那么幸运,我似乎无法避免由我的控制创建对象.
我有以下对象
class Window
{
private:
Window();
Window(Window const &windowCopy);
void operator=(Window const &windowRight);
public:
~Window();
static Window getSingleton();
};
Run Code Online (Sandbox Code Playgroud)
这是.h.大部分实现只是我cout用来在.h调用每个方法时打印消息.除了getSingleton()方法.
Window Window::getSingleton()
{
static Window singleton;
return singleton;
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要内容
int main(int argc, char *argv[])
{
Window::getSingleton();
Window::getSingleton();
std::cout << "Stack is being removed" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行后,我得到以下输出
Window created -> 0x10c9bf0e0 // This is the static …Run Code Online (Sandbox Code Playgroud) 嗨,我有一个代码片段,它是一个单例类(我相信),它以以前从未见过的方式使用'new'和其他一些作用域和静态限定符。因为我不知道它叫什么,所以找不到有关它的用途或目的的任何信息。代码如下:
在myClass.h文件中
class myClass
{
private:
static myClass sm_myClass;
myClass();
public:
static void Create(void);
};
Run Code Online (Sandbox Code Playgroud)
在myClass.cpp中,我有
#include "myClass.h"
#include <new>
myClass* p_myClass = NULL;
myClass myClass::sm_myClass;
myClass::myClass()
{
}
void myClass::Create(void)
{
p_myClass = &sm_myClass;
new (p_myClass) myClass();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1-.cpp文件的第6行(myClass myClass :: sm_myClass;)发生了什么
2-.cpp文件的第16行(new(p_myClass)myClass();)发生了什么
3-以这种方式使用类的总体目的是什么?
我真的希望这个问题不再重复。我搜索了一段时间,但不知道要搜索什么词。谢谢你的帮助。
C++ 单例设计模式我遇到这个问题并了解到在 C++ 中有两种实现单例模式的方法。
1)在堆中分配单个实例并在instance()调用中返回它
2)在instance()调用中返回一个静态实例,这也称为延迟初始化实现。
但我认为第二个,即延迟初始化实现,是错误的,原因如下。从instance()调用返回的静态对象具有内部链接,并且在不同的翻译单元中具有唯一的副本。因此,如果用户修改单例,它不会反映在任何其他翻译单元中。
但有很多说法表明第二种实现是正确的,我是否遗漏了什么?
我正在尝试将我之前在 PHP 和 Java 8 中使用过的单例实现到 C++。但我确实面临语法和 C++ 工作方式(特别是指针)的某些限制。
这是我迄今为止尝试过的:
#include "iostream"
using namespace std;
class System{
protected:
static System *obj;
public:
static System *getInstance(){
return obj;
}
void prn(){
cout<<"this works!";
}
};
int main(void){
System &sys = System::getInstance();
sys.prn();
}
Run Code Online (Sandbox Code Playgroud)
执行时,我收到以下错误:
sameer.cpp:20:10: error: non-const lvalue reference to type 'System'
cannot bind
to a temporary of type 'System *'
System &sys = System::getInstance();
^ ~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个错误..因为我不知道它是什么意思。我在发帖前检查了论坛,它可能与之前提出的问题(我找不到)重复。但我发帖是因为我想了解我的代码生成的错误的含义。
谢谢您的帮助