Форум программистов, компьютерный форум CyberForum.ru

Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива - C++

Восстановить пароль Регистрация
 
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 16:05     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #1
Создайте новую версию класса Stack с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей на объекты и размер этого массива. Конструктор должен перебирать элементы массива и заносить каждый указатель в стек. Протестируйте класс с массивом объектов string.
require.h
Кликните здесь для просмотра всего текста
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
//: :require.h
// From "Thinking in C++, 2nd Edition, Volume 2"
// by Bruce Eckel & Chuck Allison, (c) 2001 MindView, Inc.
// Available at [url]www.BruceEckel.com[/url].
// Test for error conditions in programs
// Local "using namespace std" for old compilers
#ifndef REQUIRE_H
#define REQUIRE_H
#include <cstdio>
#include <cstdlib>
#include <fstream>
 
inline void require(bool requirement, 
  const char* msg = "Requirement failed") {
  using namespace std;
  if (!requirement) {
    fputs(msg, stderr);
    fputs("\n", stderr);
    exit(1);
  }
}
 
inline void requireArgs(int argc, int args, 
  const char* msg = "Must use %d arguments") {
  using namespace std;
   if (argc != args + 1) {
     fprintf(stderr, msg, args);
     fputs("\n", stderr);
     exit(1);
   }
}
 
inline void requireMinArgs(int argc, int minArgs,
  const char* msg = 
    "Must use at least %d arguments") {
  using namespace std;
  if(argc < minArgs + 1) {
    fprintf(stderr, msg, minArgs);
    fputs("\n", stderr);
    exit(1);
  }
}
  
inline void assure(std::ifstream& in, 
  const char* filename = "") {
  using namespace std;
  if(!in) {
    fprintf(stderr,
      "Could not open file %s\n", filename);
    exit(1);
  }
}
 
inline void assure(std::ofstream& in, 
  const char* filename = "") {
  using namespace std;
  if(!in) {
    fprintf(stderr,
      "Could not open file %s\n", filename);
    exit(1);
  }
}
#endif // REQUIRE_H ///:~


Stack.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Stack.h
#ifndef STACK_H
#define STACK_H
 
class Stack{
    struct Link{
        void* data;
        Link* next;
        Link(void* dat, Link*nxt);
        ~Link();
    }*head;
public:
    Stack();
    Stack(void* mass,int size);
    ~Stack();
    void push(void *dat);
    void * peek();
    void * pop();
 
 
};
#endif


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
//Stack.cpp
#include "Stack.h"
#include "require.h"
using namespace std;
 
 
Stack::Link::Link(void* dat, Link*nxt){
    data=dat;
    next=nxt;
}
Stack::Link::~Link(){}
 
 
Stack::Stack(){head=0;}
 
Stack::Stack(void* mass,int size){
    // КАК создать? вот мой бред
    /*
        for(int i=0;i<size;++i)
            push(mass[i]); //push(new std::string(Film[i]))
    std::cout<<mass[0];
    */
}
Stack::~Stack(){require(head==0,"Stack not empty");}
 
void Stack::push(void *dat){
    head=new Link(dat,head);
}
 
void*  Stack::peek(){
    require(head!=0,"Stack empty");
    return head->data;
}
void*  Stack::pop(){
    if(head==0) return 0;
    void*result=head->data;
    Link*OL=head;
    head=head->next;
    delete OL;
    return result;
}
TestStack.cpp
Кликните здесь для просмотра всего текста

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
//TestStack.cpp
#include <iostream>
#include "Stack2.h"
#include <string>
 
 
 
int main(){
    Stack Films;
    std::string Film[25],temp;
    for(char i=0;i<25;i++) {
        temp+="*";
        Film[i]=temp;
        //std::cout<<Film<<std::endl;
        Films.push(new std::string(Film[i]));
    }
 
    std::string  *s1;   
    while ((s1=(std::string *)Films.pop())!=0) {
        std::cout<<*s1<<std::endl;
        delete s1;
    }
    return 0;
 
}

В файле Stack.cpp нужно изменить конструктор, как это реализовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2013, 16:05     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива
Посмотрите здесь:

C++ Передать в функцию размер массива указателей
C++ Массив указателей на объекты подклассов
Указатель на массив указателей на объекты, передать в метод объекта C++
C++ как понять: массив указателей на объекты классов?
C++ Виртуальные функции (создать массив указателей на объекты трех классов)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 16:32     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #2
Судя по всему должно быть нечто такое:
C++
1
2
3
4
Stack::Stack(void** mass,int size){
        for(int i=0;i<size;++i)
            push(mass[i]);
}
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 17:18  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Судя по всему должно быть нечто такое:
C++
1
2
3
4
Stack::Stack(void** mass,int size){
        for(int i=0;i<size;++i)
            push(mass[i]);
}
если так сделать, то тогда,как можно протестировать?
Я понимаю так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "Stack.h"
#include <string>
using namespace std;
 
int main(){
    string Film[25],temp;
    for(char i=0;i<25;i++) {   temp+="*";  Film[i]=temp;  } // Заполнение массива строк
 
    Stack Films(Film,25);// Инициализация
 
    string  *s1;   
    while ((s1=(string *)Films.pop())!=0) {
       cout<<*s1<<endl;
        delete s1; //освобождение
    }
    return 0;
}
Оно должно так работать вроде, но не работает.

Добавлено через 2 минуты
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
#include <iostream>
#include "Stack.h"
#include <string>
 
 
 
int main(){
    //Конструктор по умолчанию
    Stack Films;
    
    std::string Film[25],temp;
    for(char i=0;i<25;i++) {
        temp+="*";
        Film[i]=temp;
        //std::cout<<Film<<std::endl;
        Films.push(new std::string(Film[i]));
    }
 
    std::string  *s1;   
    while ((s1=(std::string *)Films.pop())!=0) {
        std::cout<<*s1<<std::endl;
        delete s1;
    }
    
    
    std::string  *s2;   
    //Конструктор с параметрами
    Stack Films2(Film,25);
    while ((s2=(std::string *)Films2.pop())!=0) {
        std::cout<<*s2<<std::endl<<"!";
        delete s2;
    }
    
    return 0;
 
}
как-то так должно работать
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 17:28     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #4
helloy, Ваш стек хранит всего лишь указатели на объекты. Он не является владельцем этих объектов.
Поэтому не надо вызывать delete, если не было соответствующего new. (Это вроде бы учтено во втором примере). Однако для проверки можно и вовсе обойтись без new/delete, т.к. объект стека (Films) живет не дольше, чем объекты (Film[25]), указатели на которые он хранит.
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 17:31  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #5
Цитата Сообщение от Tulosba Посмотреть сообщение
helloy, Ваш стек хранит всего лишь указатели на объекты. Он не является владельцем этих объектов.
Поэтому не надо вызывать delete, если не было соответствующего new. (Это вроде бы учтено во втором примере). Однако для проверки можно и вовсе обойтись без new/delete, т.к. объект стека (Films) живет не дольше, чем объекты (Film[25]), указатели на которые он хранит.
я не пойму, как сделать код рабочим(((
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 17:44     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int size = 25;
std::string* Film[size];
for(int i=0;i<size;i++) 
{ 
    Film[i] = new std::string( i+1, '*');  
} 
 
Stack FilmsStack(Film,size); 
 
std::string* s;   
while (s = static_cast<std::string*>(FilmsStack.pop())!=0 ) 
{
   std::cout << *s << std::endl;
   delete s;
}
На работоспособность не проверял.
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 17:47  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #7
C++
1
Stack FilmsStack(Film,size);
На работоспособность не проверял.
Stack::Stack(void **,int): невозможно преобразовать параметр 1 из "std::string *[25]" в "void **"
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 18:15     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
 
    const int size = 25;
    std::string* Film[size]; 
    for(int i=0;i<size;i++) 
    { 
        Film[i] = new std::string( i+1, '*');  
    } 
     
    Stack FilmsStack( reinterpret_cast<void**>(Film),size); 
     
    std::string* s;   
    while (s = static_cast<std::string*>(FilmsStack.pop()) ) 
    {
       std::cout << *s << std::endl;
       delete s;
    }
   return 0;
 
}
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 18:45  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #9
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
reinterpret_cast<void**>(Film)}
Я тоже так подумал, но мой VS меня огорчил
а неразрешенный внешний символ "public: __thiscall Stack::Stack(void * *,int)" (??0Stack@@QAE@PAPAXH@Z) в функции _main
целый день один пример)/

Добавлено через 20 минут
После нескольких минут проведенных с бубном код запустился и всё бы нормально, но получился бесконечный цикл)))
C++
1
2
3
4
5
while ((s = static_cast<std::string*>(FilmsStack.pop()))!=NULL ) 
{
    std::cout << *s << std::endl;
   delete s;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 18:45     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #10
Цитата Сообщение от helloy Посмотреть сообщение
Я тоже так подумал, но мой VS меня огорчил
В stack.h поменяли
C++
1
Stack(void* mass,int size);
на
C++
1
Stack(void** mass,int size);
?
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 18:46  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #11
Цитата Сообщение от Tulosba Посмотреть сообщение
В stack.h поменяли
C++
1
Stack(void* mass,int size);
на
C++
1
Stack(void** mass,int size);
?
конечно.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 18:46     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #12
Цитата Сообщение от helloy Посмотреть сообщение
но получился бесконечный цикл
странно. http://ideone.com/Cwcbfl
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2013, 18:55     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива
Еще ссылки по теме:

Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
C++ динамический массив указателей на объекты
Массив указателей на объекты C++

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

Или воспользуйтесь поиском по форуму:
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 18:55  [ТС]     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива #13
Цитата Сообщение от Tulosba Посмотреть сообщение
странно. http://ideone.com/Cwcbfl
так у меня тоже всё компилится, ладно буду искать)))

Добавлено через 6 минут
Всё, всё работает спасибо.
Без бубна никак не работало)))
Yandex
Объявления
27.11.2013, 18:55     Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива
Ответ Создать тему
Опции темы

Текущее время: 12:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru