返回指向静态对象的指针

时间:2017-01-04 07:22:07

标签: c++ pointers

在一个.cc文件中声明一个对象的静态指针,然后用一个函数将该指针返回另一个.cc文件中的第二个静态指针安全或不好的做法?我在file_a.cc和file_b.cc中有两个静态指针,但使用一个函数使file_b.cc中的指针指向file_a.cc中声明的同一对象。感觉我做的事情非常糟糕。我呢?如果我调用foo()然后调用print_object()它将打印1,因此指针指向同一个对象。

/** file_a.h */
#ifndef FILE_A_H
#define FILE_A_H

struct Object {
    int value = 0;
}

Object* get_object();

void print_object();

#endif


/** file_a.cc */
#include "file_a.h"

static Object* object = new Object();

Object* get_object() {
    return object;
}

void print_object() {
    std::cout << object->value << std::endl;
}


/** file_b.h */
#ifndef FILE_B_H
#define FILE_B_H

#include "file_a.h"

void foo();

#endif


/** file_b.cc */
#include "file_b.h"

static Object* object = get_object();

void foo() {
    object->value += 1;
}

2 个答案:

答案 0 :(得分:1)

这里没有什么不好的。不同的编译单元中有两个不同的静态指针,但两者都指向同一个对象。

简单地说,它不是常见模式,因为该对象是在其访问器函数之外创建的。这段代码更常见:

Object* get_object() {
    static Object* object = new Object();
    return object;
}

它提供了更好的封装,因为该对象只能通过get_object访问,并且标准保证在首次调用访问器函数时创建对象 - 前提是它仅由一个单独的线程初始化。 ..

答案 1 :(得分:0)

在2个源文件中声明2个static个同名变量,结果为2个不同的个实例。