11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
1

Передать переменную из класса в класс

16.06.2016, 11:08. Показов 12736. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, следующая задача передать переменную из класса А в класс В
class_a.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef CLASS_A_H
#define CLASS_A_H
 
 
class class_A
{
public:
    class_A();
 
    int x;
    return_x(int x);
};
 
#endif // CLASS_A_H
class_a.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "class_a.h"
#include <iostream>
 
using namespace std;
class_A::class_A()
{
    x = 5;
 
}
 
class_A::return_x(int x){
    cout << x;
    return x;
}
class_b.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef CLASS_B_H
#define CLASS_B_H
 
 
class class_B
{
public:
    class_B();
};
 
#endif // CLASS_B_H
class_b.cpp
C++
1
2
3
4
5
6
#include "class_b.h"
 
class_B::class_B()
{
    
}
Подскажите плиз, как реализовать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2016, 11:08
Ответы с готовыми решениями:

Как передать в переменную класс-наследник?
Есть главный класс куда я отправляю класс-контроллер class DrawBase { private: Controller*...

Нужно из класса наследника передать параметры в класс родителя
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; class ploskost{ protected: float d;...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { ...

Как получить private переменную класса, функцей членом другого класса
Игра змейка: Есть класс поле в котором содержится размеры поля: class field { private: ...

23
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
16.06.2016, 11:11 2
C++
1
2
3
4
5
6
7
8
9
10
11
class class_B
{
    int x;
public:
    class_B(int xx);
};
 
class_B::class_B(int xx): x(xx)
{
    
}
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.06.2016, 11:18 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <fstream>
#include <iostream>
using namespace std;
 
class A
{
private:
    int m_age;
public:
    A()
    {
    }
    A( const int age )
    {
        m_age = age;
    }
    void setAge( const int age )
    {
        m_age = age;
    }
    int getAge() const
    {
        return m_age;
    }
};
 
class B
{
public:
    B()
    {
    }
    B( const int age )
    {
        cout << "I get A age in constructor " << age << endl;
    }
    void receiveAge( const int age )
    {
        cout << "or i can get it in any time by method " << age << endl;
    }
};
void main()
{
    A man1;
    man1.setAge( 17 );
    B woman1( man1.getAge() );
 
 
    A man2( 19 );
    B women2;
    women2.receiveAge( man2.getAge() );
}
0
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 12:25  [ТС] 4
Вроде получилось вот таким способом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
/* class A */
 
class class_A
{
public:
    class_A();
 
    int i;
    return_x();
};
 
class_A::class_A(){ i =10; }
 
class_A::return_x(){
    cout <<" i in class A\n"<< i;
    return i;
}
 
/*=class B=========*/
 
class class_B
{
    int j;
public:
    class_B();
 
};
 
class_B::class_B()
{
    class_A a;
    j = a.i;    // копируем значение переменной 
    cout << "var i in class_b " << j;
}
 
/*----------------------------*/
 
int main(){
    class_A a;
    a.return_x();
    class_B b;
    return 0;
}
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
17.06.2016, 12:54 5
Сомнительное решение.
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 13:05  [ТС] 6
Согласна, к тому же с символьным массивом этот вариант не работает, думаю дальше....
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
17.06.2016, 13:09 7
Цитата Сообщение от Ирина197708 Посмотреть сообщение
Вроде получилось
че и даже предупреждения не было?
Цитата Сообщение от Ирина197708 Посмотреть сообщение
C++
1
2
3
class_A::return_x(){
 cout <<" i in class A\n"<< i;
 return i;
Цитата Сообщение от Ирина197708 Посмотреть сообщение
return_x();
что возвращает функция?
0
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 13:50  [ТС] 8
Ничего то не получается....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string.h>
 
using namespace std;
 
/* class A */
 
class class_A
{
public:
    class_A();
 
    return_x(char pchar[]);
};
 
class_A::class_A(){
char buffer[] = "hellloooo"; // инициализация символьного массива в классе
 
 cout << buffer; 
 
}
 
class_A::return_x(char pchar[]){
    strcpy(pchar, buffer);
    cout <<" i in class A\n"<< pchar;
}
 
/*=class B=========*/
 
class class_B
{
    char j[];
public:
    class_B();
 
};
 
class_B::class_B()
{
    class_A a;
    j = a.return_x();
    cout << "var i in class_b " << j;
}
 
/*----------------------------*/
 
int main(){
    class_A a;
 
    class_B b;
    return 0;
}

2 ошибки:
- error: 'buffer' was not declared in this scope
- no matching function for call to 'class_A::return_x()'

Нельзя напрямую из класса в класс передать значение переменной?

Добавлено через 7 минут
- error: 'buffer' was not declared in this scope - по этой ошибке понятно, объявление необходимо делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class class_A
{
public:
    class_A();
char buffer[128];
    return_x(char pchar[]);
 
};
 
class_A::class_A(){
buffer = "hellloooo"; // инициализация символьного массива в классе
 
 cout << buffer;
 
}
но тогда получается другая ошибка:
incompatible types in assignment of 'const char [10]' to 'char [128]'
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
17.06.2016, 14:01 9
Если ты делаешь класс A внутри класса B, то как его инициализировать? Не смешивай их, показали же как делать передачу.
Цитата Сообщение от Ирина197708 Посмотреть сообщение
но тогда получается другая ошибка:
incompatible types in assignment of 'const char [10]' to 'char [128]'
Для древних строк только strcpy():
C++
1
strcpy(buffer, "hellloooo");
1
7 / 7 / 2
Регистрация: 28.04.2015
Сообщений: 21
17.06.2016, 14:18 10
Работает для любых типов данных.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
template<typename T>
class class_A {
    T Ax;
public:
    class_A(T setVal) : Ax(setVal) {}
    T getAx() {
        return Ax;
    }
};
 
template<typename T>
class class_B {
    T Bx;
public:
    class_B(class_A<T> classA) : Bx(classA.getAx()) {}
    T getBx() {
        return Bx;
    }
};
 
int main() {
    class_A<char*> a("This is test");
    class_B<char*> b(a);
    std::cout << b.getBx() << '\n';
    return 0;
}
Добавлено через 6 минут
P.S. Чтоб использовать другой тип, нужно в <> его указать при создании обоих обьектов.
Для int будет так:

C++
1
2
    class_A<int> a(255);
    class_B<int> b(a);
0
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 14:48  [ТС] 11
Цитата Сообщение от nmcf Посмотреть сообщение
Не смешивай их, показали же как делать передачу.
nmcf, вот это я и понимаю, что не надо смешивать...
Как раз не понимаю как мне реализовать для моего случая.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string.h>
 
using namespace std;
 
/* class A */
 
class class_A
{
public:
    class_A();
   enum {MAX = 80 };
    char buffer[MAX];
    return_x(char pchar[]);
 
};
 
class_A::class_A(){
    char buff[]="hhh"; //инициализация символьного массива в классе ПРОИСХОДИТ ДИНАМИЧСКИ
    strcpy(buffer, buff);
 
 cout << buffer;
 
}
 
class_A::return_x(char pchar[]){
    strcpy(pchar, buffer);
    cout <<" i in class A\n"<< pchar;
}
 
/*=class B=========*/
 
class class_B
{
    char j[];
 
public:
    class_B();
 
};
 
class_B::class_B()
{
    class_A a;
    strcpy(j, a.return_x); // ЗДЕСЬ мы должны получить переменную класса А и в итоговой программе передать на форму
    // так как в рабочей программе в классе В создается форма с label
    cout << "var i in class_b " << j;
}
 
/*----------------------------*/
 
int main(){
 
    class_B b;  // 
 
    return 0;
}
Добавлено через 22 минуты
Вот так заработало, знаю что это не правильно(ТАК ДЕЛАТЬ НЕЛЬЗЯ), но как правильно пока не поняла....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string.h>
 
using namespace std;
 
/* class A */
 
class class_A
{
public:
    class_A();
   enum {MAX = 80 };
    char buffer[MAX];
 //   return_x(char pchar[]);
 
};
 
class_A::class_A(){
    char buff[]="hhh"; //инициализация символьного массива в классе ПРОИСХОДИТ ДИНАМИЧСКИ
    strcpy(buffer, buff);
 
 cout << buffer;
 
}
/*
class_A::return_x(char pchar[]){
    strcpy(pchar, buffer);
    cout <<" i in class A\n"<< pchar;
}
*/
/*=class B=========*/
 
class class_B
{
    char j[];
 
public:
    class_B();
 
};
 
class_B::class_B()
{
    class_A a;
    strcpy(j, a.buffer); // ЗДЕСЬ мы должны получить переменную класса А и в итоговой программе передать на форму
    // так как в рабочей программе в классе В создается форма с label
    cout << "var i in class_b " << j;
}
 
/*----------------------------*/
 
int main(){
 
    class_B b;  //
 
    return 0;
}
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
17.06.2016, 15:23 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string.h>
 
using namespace std;
 
/* class A */
 
class class_A
{
    char buffer[80];
public:
    class_A(const char *s);
    void return_x(char pchar[]);
};
 
class_A::class_A(const char *s)
{
    strcpy(buffer, s);
 
 cout << buffer;
 
}
 
void class_A::return_x(char pchar[])
{
    strcpy(pchar, buffer);
    cout <<" i in class A\n"<< pchar;
}
 
/*=class B=========*/
 
class class_B
{
    char j[80];
 
public:
    class_B() { char[0] = '\0'; }
    set_j(const char *s);
};
 
class_B::set_j(const char *s)
{
    strcpy(j, s);
}
 
/*----------------------------*/
 
int main(){
 
    class_A a("abc");
    class_B b;
 
    char s[80];
    a.return_x(s);
    b.set_j(s);
 
    return 0;
}
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 16:42  [ТС] 13
Цитата Сообщение от nmcf Посмотреть сообщение
class_B() { char[0] = '\0'; }
Здесь видимо должна быть переменная?

Добавлено через 25 минут
В любом случае, спасибо. Твой Вариант работает.
Но в моей реализации это не подойдет.
Ты присваиваешь значение классу А в функции main() , а мне необходимо получить именно в класс. Так сказать на лету.
Может код поможет понять что у меня не получается:
mythread.cpp получает данные из сокета:

recievedBytes = recv( clientSocket, buffer, BUFFER_SIZE - 1, 0 );
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
 
#include "mythread.h"
#include "widget.h"
#include <iostream>
 
#define PORT 1515
#define BUFFER_SIZE 1024
#define MEMORY_SIZE BUFFER_SIZE * sizeof(char)
#define GET_SOCKET_ERROR std::cout << WSAGetLastError() << std::endl
 // char* buff[1024];
   char buffer[ 1024 ];
   extern int value;
int i;
MyThread::MyThread() { stopped = false; }
 
void MyThread::run(){
  while (!stopped)
        if( WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0 )
      {
          serverAcceptor = socket( AF_INET, SOCK_STREAM, 0 );
 
          if( serverAcceptor )
          {
              sockaddr_in serverAddress;
 
              ZeroMemory( &serverAddress, sizeof( sockaddr_in ) );
              serverAddress.sin_family = AF_INET;
              serverAddress.sin_port = htons( 1515 );
              serverAddress.sin_addr.S_un.S_addr = htonl( INADDR_LOOPBACK );
 
              if( ( bind( serverAcceptor, reinterpret_cast< const sockaddr* >( &serverAddress ), sizeof( sockaddr_in ) ) != SOCKET_ERROR ) &&
                  ( listen( serverAcceptor, 1 ) != SOCKET_ERROR ) )
              {
                 // const int BUFFER_SIZE = 1024;
                  int clientAddressLength = sizeof( sockaddr_in );
                //  char buffer[ BUFFER_SIZE ];
 
                  sockaddr_in clientAddress;
                  SOCKET clientSocket;
 
                  ZeroMemory( &clientAddress, sizeof( sockaddr_in ) );
 
                  while( true )
             //     if(true)
                  {
                      const int CLIENT_ADDR_STR_SIZE = 64;
                      char clientAddressStr[ CLIENT_ADDR_STR_SIZE ];
 
                      int recievedBytes = 0;
                      int sendedBytes = 0;
 
                      std::cout << "Start listening..." << std::endl;
                      clientSocket = accept( serverAcceptor, reinterpret_cast< sockaddr* >( &clientAddress ), &clientAddressLength );
 
                      if( clientSocket != INVALID_SOCKET )
                      {
                          do
                          {
                              std::string sendBuffer;
 
                              ZeroMemory( buffer, BUFFER_SIZE );
                              ZeroMemory( clientAddressStr, CLIENT_ADDR_STR_SIZE );
 
                              recievedBytes = recv( clientSocket, buffer, BUFFER_SIZE - 1, 0 );
 
                              if( recievedBytes != SOCKET_ERROR )
                              {
                                  std::cout << "--> " << buffer << " [ bytes: " << recievedBytes << " ]" << std::endl;
                                  //забрать переменную buffer
                              get_buffer();
 
                                  sendBuffer = buffer;
                                  sendBuffer = "From server: " + sendBuffer;
 
                                  do
                                  {
                                      sendedBytes = send( clientSocket, sendBuffer.c_str(), sendBuffer.size() + 1, 0 );
                                        printf(" sendedBytes: %d", sendedBytes);
                                  } while( false );
                              }
 
                          } while( ( recievedBytes != SOCKET_ERROR ) && ( sendedBytes != SOCKET_ERROR ) );
 
                          std::cout << std::endl <<  "Client lost." << std::endl;
                          closesocket( clientSocket );
                      }
                      else
                      {
                          GET_SOCKET_ERROR;
                          break;
                      }
                  }
 
                  closesocket( serverAcceptor );
              }
              else { GET_SOCKET_ERROR; }
          }
          else { GET_SOCKET_ERROR; }
 
          WSACleanup();
      }
      else{ std::cout << WSAGetLastError() << std::endl; }
 
  //    return 1;
  stopped = false;
  strcpy(buffers, buffer);
 
}
 
 
void MyThread::stop(){
    stopped = true;
    closesocket( serverAcceptor );
     WSACleanup();
}
 
//void MyThread::setMessage(const QString &message){ }
MyThread::get_buffer(){
    printf ("get_buffer(buffer) =  %s",buffer);
    value = atoi(buffer);
    printf("value =  %d", value);
    return value;
}
В итоге переменная buffer должна попасть в метку label на форме:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "widget.h"
#include "mythread.h"
extern int value;
extern char buffer[ 1024 ];
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
  setWindowTitle("Избирательная система");
    setGeometry(200,20,50,20);
    resize(365,200);
 
 
 //   threadA.setMessage("A");
 
     layout = new QGridLayout(this);
     threadAlabel = new QLabel("fff");
 //    threadAlabel->setText(buffer);
     threadAButton = new QPushButton("Запустить поток");
     StopServer = new QPushButton("Остановить поток");
     getBuffer = new QPushButton("Получить данные");
 
 //   connect(threadA, SIGNAL(clicked()), threadAlabel, SLOT(LabelSetText()));
     connect(threadAButton, SIGNAL(clicked()), this, SLOT(StartServer()));
     connect(getBuffer, SIGNAL(clicked()), this, SLOT(LabelSetText()));
 
     connect(StopServer, SIGNAL(clicked()), this, SLOT(stopserver()));
     connect(StopServer, SIGNAL(clicked()), this, SLOT(close()));
  //   QObject::connect()
     layout->addWidget(threadAlabel);
     layout->addWidget(threadAButton);
     layout->addWidget(getBuffer);
     layout->addWidget(StopServer);
    }
 
Widget::~Widget(){ }
 
 
void Widget::StartServer(){
    if(threadA.isRunning() != true){
        //threadAButton->setText(tr("Запустить поток"));
        threadA.start();
        MyThread a;
       buff1 = a.buffers;
      // if (threadA.get_buffer() == "1"){printf("printf"); }
    }
/*
 
    if (threadA.isRunning())
    {threadA.stop();
        threadAButton->setText(tr("Остановить сервер"));}
    else {
       // threadA.start();
        threadAButton->setText(tr("Принять данные"));}
   // int k = threadA.get_Server();
   // printf("%d",k);
  //  threadAlabel->setText(QString::number(k));
    */
}
void Widget::stopserver(){
    if(threadA.isRunning()){
        threadA.stop();
    }
}
void Widget::closeEvent(QCloseEvent *event)
{
    threadA.stop();
 
    threadA.wait();
 
       // threadAlabel->setText("arbat");
    }
 
 //   event->accept();
 
void Widget::LabelSetText(){
    printf("buffer in labelsettext %s =  ", buffer);  
    int i=0;
     i = atoi(buffer);
    printf("i = %d", i);
        threadAlabel->setText("1");   //ВОТ СЮДА ДОЛЖНА ПОПАСТЬ ПЕРЕМЕННАЯ buffer из класса mythread
 
    // printf("threadA.get_buffer() = %s",threadA.get_buffer());
 
}
Класс же main только создает виджет и отображает форму...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "widget.h"
#include "mythread.h"
#include <QApplication>
#include <QThread>
 
int value;
int main(int argc, char *argv[])
{
 
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

На qt внимание не обращать.
Код сервера рабочий, кроме того что не могу никак передать переменную...
0
7 / 7 / 2
Регистрация: 28.04.2015
Сообщений: 21
17.06.2016, 16:59 14
Я вот так и не понял что вам нужно. Просто передачу строки из класса в класс?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
 
class class_A {
public:
    char strA[4] = "asd";
};
 
class class_B {
public:
    char *strB;
    class_B() {
        class_A a;
        strB = new char[sizeof(a.strA)];
        strcpy_s(strB, sizeof(a.strA), a.strA);
    }
    ~class_B() {
        delete[] strB;
    }
};
 
int main() {
    class_B b;
    std::cout << b.strB << '\n';
    return 0;
}
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 17:01  [ТС] 15
Цитата Сообщение от Terrr Посмотреть сообщение
Просто передачу строки из класса в класс?
ДА, наконец то
0
7 / 7 / 2
Регистрация: 28.04.2015
Сообщений: 21
17.06.2016, 17:05 16
Дак а что вам тогда мешает просто взять и в конструкторе класса B создать обьект класса A и забрать от туда строку?
1
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 17:25  [ТС] 17
Цитата Сообщение от Terrr Посмотреть сообщение
Дак а что вам тогда мешает просто взять и в конструкторе класса B создать обьект класса A и забрать от туда строку?
Если напишете пример, буду очень признательна..
0
11 / 11 / 3
Регистрация: 06.08.2011
Сообщений: 208
17.06.2016, 17:31  [ТС] 18
Terrr, переписала немного Ваш код под свои запросы, и в итоге пришла к тому же с чего и начинала.
Код отработал, все замечательно, только вот пришла к тому с чего и начались мои проблемы в переменную strB, пришел мусор, а не знаение переменной...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string.h>
 
 
using namespace std;
 
class class_A {
public:
    class_A();
    char buffer[];
};
 
class_A::class_A()
{
   char strA[] = "asd";
    strcpy(buffer, strA);
 
 cout << buffer;
 
}
 
class class_B {
public:
    char *strB;
    class_B() {
        class_A a;
        strB = new char[sizeof(a.buffer)];
        strcpy_s(strB, sizeof(a.buffer), a.buffer);
        std::cout <<"\nclass B " << strB << '\n';
    }
    ~class_B() {
        delete[] strB;
    }
};
 
int main() {
    class_B b;
 //   std::cout << b.strB << '\n';
    return 0;
}
Компилятор выдал:
Миниатюры
Передать переменную из класса в класс  
0
7 / 7 / 2
Регистрация: 28.04.2015
Сообщений: 21
17.06.2016, 17:58 19
Лучший ответ Сообщение было отмечено Ирина197708 как решение

Решение

Нельзя обьявлять статические массивы без указания размера, т.е. это не верно:

C++
1
char buffer[];
Ну а еще я вместо вашей strcpy, поставил strcpy_s (У меня компиль ругается на strcpy, мол не безопасна она)
Вот рабочий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string.h>
 
 
using namespace std;
 
class class_A {
public:
    class_A();
    char buffer[200];
};
 
class_A::class_A()
{
    char strA[] = "asd";
    strcpy_s(buffer, sizeof(buffer), strA);
 
    cout << buffer;
 
}
 
class class_B {
public:
    char *strB;
    class_B() {
        class_A a;
        strB = new char[sizeof(a.buffer)];
        strcpy_s(strB, sizeof(a.buffer), a.buffer);
        std::cout << "\nclass B " << strB << '\n';
    }
    ~class_B() {
        delete[] strB;
    }
};
 
int main() {
    class_B b;
    //   std::cout << b.strB << '\n';
    return 0;
}
1
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
17.06.2016, 18:00 20
Цитата Сообщение от Terrr Посмотреть сообщение
Дак а что вам тогда мешает просто взять и в конструкторе класса B создать обьект класса A и забрать от туда строку?
А что мешает вообще не использовать классы в таком случае? A должен быть внешним, если это "класс-константа", то в нём нет смысла. Также как нет смысла в полях из секции public - это ничем не отличается от структур.
0
17.06.2016, 18:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2016, 18:00
Помогаю со студенческими работами здесь

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса),...

Есть два класса необходимо передать из одного класса информацию в другую
Есть два класса, class entiti { public: test* emap; }; class test { public:

Конструктор класса не дает инициализировать переменную класса
Привет. Вот такой вот класс. Когда пытаюсь в конструкторе присвоить name и hobby что либо, пишет...

В конструктор класса передать объект этого класса
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru