неправильно неправильно размещать глобальную переменную внутри функции? - PullRequest
1 голос
/ 19 августа 2011

У меня есть два «простых» вопроса на C ++.

1- Я хочу сделать переменную, совместно используемую некоторыми методами в классе, поэтому я делаю объявление переменной в заголовочном файле и делаю ее глобальной для класса. Следовательно, все методы будут иметь к нему доступ. Это правильный способ сделать это?

2 - Следуя моей первой точке, если я объявлю переменную N как double *N в заголовке. Тогда внутри одного из моих методов я делаю

N = (double*) malloc (sizeof(double)*50);

Я знаю, что N будет выделять память внутри функции. У меня вопрос: эта память зарезервирована только внутри функции или она все время остается для глобального N?

Если память не будет зарезервирована для N, то этот метод не будет хорошим методом, поскольку система может перезаписать значения N позже во время программы.

Пожалуйста, добрый совет, спасибо

РЕДАКТИРОВАТЬ: Спасибо всем за вклад и за редактирование моего вопроса. Очевидно, я ошибочно назвал свою переменную глобальной, хотя на самом деле она является членом класса. Я думал, что это объявление называется глобальным, поскольку переменная является глобальной для методов внутри класса. Надеюсь, в следующий раз я задам «умный» вопрос:)

Ответы [ 7 ]

1 голос
/ 19 августа 2011

Как правило, вам следует избегать глобальных переменных, если не существует абсолютно никакого другого решения (что, IMHO, не должно иметь место, если программное обеспечение хорошо спроектировано).

  1. Если под global вы подразумеваете как член, как это

    класс А { частный: двойной N; };

    * +1010 *

тогда да.

Если под global вы подразумеваете что-то подобное (что AFAIK является правильным понятием для global variable)

double N;
class A
{
};

тогда вам следует избегать этого и использовать предыдущий (используйте переменную как класс member ).

  1. Ваш пример не имеет смысла, поскольку double уже имеет размер. Вам нужно использовать указатель с malloc () , например double N *. Кроме того, поскольку вы программируете на C ++, используйте new . Вся память, выделенная с помощью new (рекомендуется) или malloc () (не рекомендуется), остается зарезервированной, если только вы не освободите ее вручную (что не следует забывать делать, когда этой памяти больше нет) требуется).
1 голос
/ 19 августа 2011
Память

malloc будет действовать до тех пор, пока вы free не сохраните ее.Однако это ужасно плохой дизайн.Технически это законно и правильно.Это, однако, определенно не правильный способ сделать это.Во-первых, глобальные переменные плохие .Если у вас есть дизайн, и он включает в себя глобальную переменную, подумайте еще раз, пока его нет.Во-вторых, вы должны использовать new, delete и умный указатель, а не malloc и free.В-третьих, просто сделать его переменной-членом класса?

1 голос
/ 19 августа 2011
  1. Нет, избегайте глобалов.Найдите правильный объем и инкапсуляцию для вашей переменной.Поместите это туда.

  2. Если вы объявите что-то как double и попытаетесь назначить на него указатель, ничего не произойдет.Ваш код просто не собирается компилироваться.Я полагаю, вы говорите о глобальном double*.Вам нужно malloc памяти для этого указателя, и, как обычно, с malloc не free d в конце области.Вы должны сделать это сами, но это, вероятно, менее важно для глобального.

Я просто остановлюсь здесь.В этом так много неправильного.Вы не должны использовать malloc в C ++.Вы не должны использовать простые массивы в C ++.И вы должны избегать глобалов, насколько это возможно, иметь глобалы.Вы должны указать, что вы пытаетесь сделать с помощью кода.

0 голосов
/ 19 августа 2011

Давайте немного проясним ситуацию. Предполагая, что это в заголовке members.h:

extern double a;     // this is a "global" variable declaration. It needs a definition.

class B {
  double c;          // this is a data member. There will be one in each object of class B
  static double * d; // this is a static data member. There will be a single one for
                     // all objects of class B. It needs a definition.
public:
  void f() { c = 1.0; a = 3.0; }           // A member function can access both static and
                                           // plain data members, as well as globals.
  static void g() { d = new double(2.0); } // A static member function can only access
                                           // static data members and globals.
};

Обратите внимание, что переменные / элементы данных, такие как a или c, не требуют явного выделения. С другой стороны, d делает, потому что это указатель. Также обратите внимание, что в C ++ вы используете new() вместо malloc().

Это исходный файл members.cpp:

#include "members.h"

double a; // Definition of global a

double * B::d;  // Definition for static member d

B b1;     // Static instance of class B

int main() {
  B b2;      // Local instance of class B
  b1.f();    // Calling member function f() on b1
  b2.f();    // Calling member function f() on b2
  B::g();    // Calling static member function g()
}

Надеюсь, я был достаточно ясен и покрыл ваши сомнения.

0 голосов
/ 19 августа 2011

Это не идиоматический способ создания и управления данными-членами классов в C ++!Обычно вы объявляете объект следующим образом:

class foo
{
public:
  foo() : N(0.) {}  // initialize N in the ctor
  // interface
private:
  // data
  double N;
};

Теперь все методы в foo могут читать / изменять (в зависимости от const ness) член N.Вам не нужно вручную управлять хранилищем для N, оно управляется как часть экземпляра foo.Вам не нужна отдельная «глобальная» переменная, если вы не хотите, чтобы все экземпляры из foo и ее члены использовали один и тот же N.Даже в этом случае не имеет смысла быть динамичным.

0 голосов
/ 19 августа 2011
  1. Да, это правильный путь.
  2. Если вы собираетесь использовать динамически распределенную память, вы должны объявить N как " double *", а не " double ".Кроме того, используйте « new » вместо « malloc » в C ++.Хотя вы не выпустили N bu с помощью «delete», он будет доступен глобально, поэтому он остается глобальным, а не в рамках функции.
0 голосов
/ 19 августа 2011

из моего опыта программиста я никогда не создавал переменную в заголовочном файле.Скорее, я могу создать экземпляр переменной в файле C, но EXTERN (в файле заголовка), чтобы другие классы могли использовать ее.Но если вы хотите объявить это, все будет хорошо.

И когда вы используете malloc, вы говорите, что N имеет этот размер.Но если у вас нет malloc его и вы пытаетесь использовать его в другом методе, то у вас будет ошибка сегментации из-за того, что для него нет выделенного пространства (это только для указателей и списков, массивов ии т. д. вам не нужно делать это для отдельных типов данных.)

N можно создать в любом месте, но перед использованием его необходимо создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...