C ++确定外部类指针

时间:2017-04-26 13:42:46

标签: c++

对于我目前忙于开发的c ++应用程序,我需要通过整个代码访问几个类,而不创建新对象

所以搜索我发现可以使用的方法之一是使用extern链接说明符。

我想知道使用这个extern方法的最佳方法是什么,我写了一些示例代码

classone.h
#ifndef CLASSONE_H
#define CLASSONE_H

class ClassOne
{
public:
    ClassOne();

    void showClassOneInt();

private:
    int m_classOneInt;
};

extern ClassOne *classOne;
---------------------------------------
classone.cpp
#include "classone.h"

#include <QDebug>

ClassOne *classOne;

ClassOne::ClassOne()
{
    m_classOneInt = 1;
}

void ClassOne::showClassOneInt()
{
    qDebug() << "ClassOneInt: " << m_classOneInt;
}
---------------------------------------
classtwo.h
#ifndef CLASSTWO_H
#define CLASSTWO_H

class ClassTwo
{
public:
    ClassTwo();

    void showClassTwoInt();

private:
    int m_classTwoInt;
};

#endif // CLASSTWO_H
---------------------------------------
classtwo.cpp
#include "classtwo.h"

#include <QDebug>

ClassTwo::ClassTwo()
{
    m_classTwoInt = 2;
}

void ClassTwo::showClassTwoInt()
{
    qDebug() << "ClassTwoInt: " << m_classTwoInt;
}
---------------------------------------
classthree.h
#ifndef CLASSTHREE_H
#define CLASSTHREE_H

class ClassThree
{
public:
    ClassThree();

    void showClassThreeInt();

private:
    int m_classThreeInt;
};

#endif // CLASSTHREE_H
---------------------------------------
classthree.cpp
#include "classthree.h"

#include <QDebug>

ClassThree::ClassThree()
{
    m_classThreeInt = 3;
}

void ClassThree::showClassThreeInt()
{
    qDebug() << "ClassThreeInit: " << m_classThreeInt;
}
---------------------------------------
classtest.cpp
#include "classtest.h"
#include "classone.h"
#include "classtwo.h"
#include "classthree.h"

//Class one pointer already in header

//Class two
extern ClassTwo *classTwo;

//Class three
extern ClassThree *classThree;

ClassTest::ClassTest()
{
    //Execute class one
    classOne->showClassOneInt();

    //Execute class two
    classTwo->showClassTwoInt();

    //Execute class three
    classThree->showClassThreeInt();
}
---------------------------------------
main.cpp
#include <QCoreApplication>
#include "classone.h"
#include "classtwo.h"
#include "classthree.h"
#include "classtest.h"

//Class one pointer already in header file

//Class two pointer
ClassTwo *classTwo;

//Class three pointer
ClassThree *classThree;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //Create object for class one
    classOne = new ClassOne;

    //Create object for class two
    classTwo = new ClassTwo;

    //Create object for class three
    ClassThree three;
    classThree = &three;

    //Create a classTest object
    ClassTest test;

    return a.exec();
}

请你告诉我最好的方法,谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

最好的方法是不要使用dependency injection

如果你选择这样做,你至少应该使用getter / factory函数(即ClassOne &getClassOne())),这样你就可以:

  • 确保随机代码不能更改对象和
  • 通过构建第一次使用(有时是适当的,有时不是)来隐式处理构造顺序。

答案 1 :(得分:2)

拥有全局状态通常是not a great idea,寻求消除它。

如果无法做到,请尝试singleton pattern

class Singleton
{
    Singleton();  //keep constructors private to avoid creation by others
    static Singleton inst;
public:
    static Singleton& Instance() {return inst;}
};
Singleton Singleton::inst;