Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何制作一个可以被任何东西引用的对象?_C++_Inheritance - Fatal编程技术网

C++ 如何制作一个可以被任何东西引用的对象?

C++ 如何制作一个可以被任何东西引用的对象?,c++,inheritance,C++,Inheritance,我试图使一个类ShapeManager只实例化一次,并且使一个基类Shape(及其所有子类)能够访问它。这将产生如下结构: ShapeManager 形状 └正方形 └三角形 └圆圈 我简化了很多代码,使之与我的问题相关。如果不清楚我在问什么,我会尝试进一步解释! 基本上,我只想有一个类来管理我的shape对象&保存shape的子对象将使用的数据,例如m\u gen和m\u world 编辑1:我创建ShapeManager的主要动机是存储对m_shapes、m_world和m_gen的引用,

我试图使一个类
ShapeManager
只实例化一次,并且使一个基类
Shape
(及其所有子类)能够访问它。这将产生如下结构:

ShapeManager

形状

└<代码>正方形
└<代码>三角形
└<代码>圆圈


我简化了很多代码,使之与我的问题相关。如果不清楚我在问什么,我会尝试进一步解释! 基本上,我只想有一个类来管理我的shape对象&保存
shape的
子对象将使用的数据,例如
m\u gen
m\u world


编辑1:我创建ShapeManager的主要动机是存储对m_shapes、m_world和m_gen的引用,但我不希望每个shape对象都有这3个引用变量。这意味着创建一个圆必须在ctor中包含这3个参数,以及与圆相关的参数


编辑2:单例和/或依赖注入是两种设计模式,在实现时,它们解决了我的问题。谢谢大家!

不要试图通过所有代码访问全局变量。使某个对象只对需要它的人可用。因此,在Shape中创建一个私有的
ShapeManager
,并将其传递给
Shapes
构造函数

但仍然奇怪的是,
Shape
必须访问
ShapeManager


编辑-作者评论:我创建ShapeManager的主要动机是存储对m_shapes、m_world和m_gen的引用,但我不希望每个shape对象都有这3个引用变量

您可以有一个存储3个引用变量的结构,每个需要访问它们的对象都有一个私有结构

其他一些文件:

struct myManagers {
ShapeManager *shapeMan;
WorldManager *worldMan;
GenManager *genMan;
}
形状h:

#ifndef H_SHAPE // Include guards to avoid circular dependency
#define H_SHAPE
#include "ShapeManager.h" // so that i can access it's member functions

class Shape {
protected:
    std::string m_name;
    myManagers *myMan = nullptr;

public:
    Shape(myManagers *myManager) : m_name("Shape"), myMan(myManager) {}
    std::string getName() { return m_name; }
};

#endif
用法如下:

int main() {
myManagers GlobalManager;
GlobalManager.shapeMan = &ShapeManager;
// ... fill in other 2 managers

Shape myBall(&GlobalManager);
// this way myBall has access to all 3 references
}

注:include-guard几乎是唯一可以接受宏的情况

不要试图通过所有代码访问全局变量。使某个对象只对需要它的人可用。因此,在Shape中创建一个私有的
ShapeManager
,并将其传递给
Shapes
构造函数

但仍然奇怪的是,
Shape
必须访问
ShapeManager


编辑-作者评论:我创建ShapeManager的主要动机是存储对m_shapes、m_world和m_gen的引用,但我不希望每个shape对象都有这3个引用变量

您可以有一个存储3个引用变量的结构,每个需要访问它们的对象都有一个私有结构

其他一些文件:

struct myManagers {
ShapeManager *shapeMan;
WorldManager *worldMan;
GenManager *genMan;
}
形状h:

#ifndef H_SHAPE // Include guards to avoid circular dependency
#define H_SHAPE
#include "ShapeManager.h" // so that i can access it's member functions

class Shape {
protected:
    std::string m_name;
    myManagers *myMan = nullptr;

public:
    Shape(myManagers *myManager) : m_name("Shape"), myMan(myManager) {}
    std::string getName() { return m_name; }
};

#endif
用法如下:

int main() {
myManagers GlobalManager;
GlobalManager.shapeMan = &ShapeManager;
// ... fill in other 2 managers

Shape myBall(&GlobalManager);
// this way myBall has access to all 3 references
}

ps:include guards几乎是唯一可以接受宏的场合

您正在寻找的是单例设计模式。请参阅下面的代码:

class ShapeManager
{
public:
static ShapeManager& instance()
{
    static ShapeManager *instance = new ShapeManager();
    return *instance;
}

private:
    ShapeManager(){}

/*
    use this space to fill in your code
    */
}
您可以通过以下方式访问类成员:

ShapeManager::instance().getDRE();

这将限制为类的单个实例。不需要实例化这个类的对象,事实上,你不能也可以从任何地方访问。

你要找的是单例设计模式。请参阅下面的代码:

class ShapeManager
{
public:
static ShapeManager& instance()
{
    static ShapeManager *instance = new ShapeManager();
    return *instance;
}

private:
    ShapeManager(){}

/*
    use this space to fill in your code
    */
}
您可以通过以下方式访问类成员:

ShapeManager::instance().getDRE();


这将限制为类的单个实例。不需要实例化此类的对象,事实上,您不能也可以从任何地方访问。

您可以存储
ShapeManager
(或类似的内容)的全局实例并使用它。警告:ShapeManager.h包括Shape.h和Shape.h包括ShapeManager.h。这是一个循环依赖项。阅读可以避免将来的问题。为什么形状需要与形状管理器交互?我希望是另一种情况。您可能将管理和服务混为一谈。我尝试在main()上方声明一个全局ShapeManager,但Shape的子级仍然无法访问它。您正在询问如何创建singleton对象。这是一种众所周知的(尽管并不总是受欢迎)模式,现在您已经知道要搜索的单词,使用它不会有任何问题。您可以存储
ShapeManager
(或类似内容)的全局实例并使用它。警告:ShapeManager.h包括Shape.h和Shape.h包括ShapeManager.h。这是一个循环依赖项。阅读可以避免将来的问题。为什么形状需要与形状管理器交互?我希望是另一种情况。您可能将管理和服务混为一谈。我尝试在main()上方声明一个全局ShapeManager,但Shape的子级仍然无法访问它。您正在询问如何创建singleton对象。这是一个众所周知的模式(尽管并不总是被喜欢),现在您知道要搜索哪个词,使用它不会有问题我创建
ShapeManager
的主要动机是存储对m_shapes、m_world和m_gen的引用,但我不希望每个shape对象都有这3个引用变量。这意味着创建一个
必须在ctor中包含这3个参数,以及与圆相关的参数是非标准的,可能适用于任何现代编译器,但可能不是。很高兴知道向下投票的原因:)这是一个很好的方法,尽管我真的希望我的形状因子只具有特定于自身的参数,例如
Circle(float radius,sf::Vector2f pos)并可以访问这些常用变量。如果我找不到办法,我可能会用你的方法!附言:我曾经带你回到0 loluse
pragma
我创建
ShapeManager
的主要动机是存储对m_shapes、m_world和m_gen的引用,但我不想这样做