Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
#1

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

27.11.2013, 16:05. Просмотров 498. Ответов 12
Метки нет (Все метки)

Создайте новую версию класса 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 нужно изменить конструктор, как это реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2013, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива (C++):

Из массива сформировать другой массив, размер которого два раза меньше. - C++
6. Дан массив чисел размерностью 20, тип данных int, из этого массива сформировать другой массив, размер которого два раза меньше.

Массив указателей на объекты - C++
Доброго времени суток. В моем коде базовый класс имеет два наследника. Четвертый класс содержит динамический массив указателей на...

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Динамический массив указателей на объекты - C++
вообщем была тут на форуме задача, в подробности вдаваться не буду, смысл сейчас заключается в том, чтобы создавать в цикле объекты, и в их...

Массив указателей на объекты подклассов - C++
Доброго времени суток всем!!! Проф задал написать парсер простых математических выражений с использованием скобок. Код не должен...

Динамический массив указателей на объекты класса - C++
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...

12
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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]);
}
0
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;
 
}
как-то так должно работать
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.11.2013, 17:28 #4
helloy, Ваш стек хранит всего лишь указатели на объекты. Он не является владельцем этих объектов.
Поэтому не надо вызывать delete, если не было соответствующего new. (Это вроде бы учтено во втором примере). Однако для проверки можно и вовсе обойтись без new/delete, т.к. объект стека (Films) живет не дольше, чем объекты (Film[25]), указатели на которые он хранит.
0
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 17:31  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
helloy, Ваш стек хранит всего лишь указатели на объекты. Он не является владельцем этих объектов.
Поэтому не надо вызывать delete, если не было соответствующего new. (Это вроде бы учтено во втором примере). Однако для проверки можно и вовсе обойтись без new/delete, т.к. объект стека (Films) живет не дольше, чем объекты (Film[25]), указатели на которые он хранит.
я не пойму, как сделать код рабочим(((
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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;
}
На работоспособность не проверял.
1
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 **"
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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;
 
}
1
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;
}
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.11.2013, 18:45 #10
Цитата Сообщение от helloy Посмотреть сообщение
Я тоже так подумал, но мой VS меня огорчил
В stack.h поменяли
C++
1
Stack(void* mass,int size);
на
C++
1
Stack(void** mass,int size);
?
0
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);
?
конечно.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.11.2013, 18:46 #12
Цитата Сообщение от helloy Посмотреть сообщение
но получился бесконечный цикл
странно. http://ideone.com/Cwcbfl
1
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.11.2013, 18:55  [ТС] #13
Цитата Сообщение от Tulosba Посмотреть сообщение
странно. http://ideone.com/Cwcbfl
так у меня тоже всё компилится, ладно буду искать)))

Добавлено через 6 минут
Всё, всё работает спасибо.
Без бубна никак не работало)))
0
27.11.2013, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2013, 18:55
Привет! Вот еще темы с ответами:

Как понять: массив указателей на объекты классов? - C++
если приведете пример буду рад.

Указатель на массив указателей на объекты, передать в метод объекта - C++
Здравствуйте! Нужно решить задачу, есть такой класс. class MyClsDisk { public: void...

Виртуальные функции (создать массив указателей на объекты трех классов) - C++
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru