Как должна быть распределенной стоимость в договоренность указателей?

В задании они требуют у меня, чтобы он осуществил функцию формы B** f(string, int&); (неизменяемый прототип) где стоимость возврата (как я понимаю) это указатель в договоренность указателей типа B.

Случай состоит в том, что я хочу произвести, начиная со статической договоренности элементов типа A, статическая договоренность элементов типа B**, который я буду возвращать в конце функции для потом (с другой функции) пробегать это и показывать Ваши элементы.

У меня нет проблемы в получении элементов типа A, но я не знаю, как произвождение договоренности типа B** с вышеупомянутой информацией.

Внизу я подробно описываю то, что я хочу сделать (он составляет но ломается):

A.hpp

#ifndef A_HPP
#define A_HPP

class A {
public:
    char get();
    void set(char);
private:
    char a;
};

#endif

B.hpp

#ifndef B_HPP
#define B_HPP

class B {
public:
    char get();
    void set(char);
private:
    char b;
};

#endif

X.hpp

#ifndef X_HPP
#define X_HPP
#define M 2
#include "A.hpp"
#include "B.hpp"
#include <iostream>
using namespace std;

class X {
public:
    A arA[M];
    B *arB[M];
    B **f(string s, int &n);
};

#endif

A.cpp

#include "A.hpp"

char A::get() {
    return a;
}

void A::set(char c) {
    this->a=c;
}

B.cpp

#include "B.hpp"

char B::get() {
    return b;
}

void B::set(char c) {
    this->b=c;
}

X.cpp

#include "X.hpp"

B ** X::f(string s, int &n) {
    int i;
    char a=arA[i].get();
    arB[i]->set(a);
    return arB;
}

main.cpp

#include "A.hpp"
#include "X.hpp"
#include "B.hpp"
#include <cstdlib>

int main(int argc, char** argv) {
    A a;
    X x;
    B**b;
    string s="";
    int n=1;
    a.set('A');
    b=x.f(s,n);
    cout<<b[0]->get()<<endl;
    return 0;
}
2
задан 03.04.2016, 08:55
3 ответа

Основываясь на ответах Вас и вместе с моим членом команды, мы прибываем в следующее решение:

A.hpp

#ifndef A_HPP
#define A_HPP

class A {
public:
    A() {a=0;}
    int get() {return a;}
    void set(int m) {a=m;}
private:
    int a;
};

#endif

B.hpp

#ifndef B_HPP
#define B_HPP

class B {
public:
    B() {b=0;}
    int get() {return b;}
    void set(int n) {b=n;}
private:
    int b;
};

#endif

X.hpp

#ifndef X_HPP
#define X_HPP
#include "A.hpp"
#include "B.hpp"
#define M 3
#include <iostream>
using namespace std;

class X {
public:
    X();
    A arA[M];
    B *arB[M];
    B **f();
};

#endif

X.cpp

#include "X.hpp"

X::X() {
    for (int i=0; i<M; ++i) arA[i] = A();
    for (int i=0; i<M; ++i) arB[i] = new B;
}

B ** X::f() {
    for (int i=0; i<M; ++i) arB[i]->set(arA[i].get());
    return &arB[0];
}

main.cpp

#include "A.hpp"
#include "X.hpp"
#include "B.hpp"
#include <cstdlib>

int main(int argc, char** argv) {   
    X x;
    B** b;
    for (int i=0; i<M; ++i) x.arA[i].set(1);
    b=x.f();
    for (int i=0; i<M; ++i) cout<<b[i]->get();
    return 0;
}

Мы применяем те же начала к главному проекту и я функционирую верно.

1
ответ дан 24.11.2019, 14:39
class X {
public:
    A arA[M];
    B *arB[M];
    B **f(string s, int &n);
};

B ** X::f(string s, int &n) {
    int i;
    char a=arA[i].get();
    arB[i]->set(a);
    return arB;
}

Не, если ты обратил внимание, но arB не инициализируйся ни в каком сайте, потом выполнив инструкцию arB[i]->set(a), arB[i] он не указывает на действительную ячейку запоминающего устройства и результат обычно является губительным.

В твоем случае простое решение могло бы состоять в том, чтобы удалять меткую двойную порцию в X и возвращать ссылку вышеупомянутого объекта (то, что подразумевает меткую двойную порцию):

class X {
public:
    A arA[M];
    B arB[M];
    B **f(string s, int &n);
};

B ** X::f(string s, int &n) {
    int i;
    char a=arA[i].get();
    arB[i].set(a);
    return &arB;
}

Я ИЗДАЮ: Это не решает многие другие проблемы твоего кода. Я перечисляю какие-то тебе X::f() но оставшаяся часть программы сеялась:

  • i не инициализируйся.
  • n и s он не используется абсолютно ни для чего. Зачем у него есть тогда параметры функция?
  • Конечно, что функция должна делать копию arA в arB??
  • arA он не incializado. Который стоимость хранила в arA[0] или в arA[1]? То же самое применимое в arB.
  • Он состоял бы в том, чтобы быть благодарным за то, что A он считал осуществленным назначенного по умолчанию строителя, чтобы инициализировать члены класса. Стой, что A он не принадлежит в X::f(), но он используется в arA. Применимое то же самое для B.

Приветствие.

1
ответ дан 24.11.2019, 14:39
  • 1
    Также est и # 225; инициализировавшая i funci и # 243; n X::f, с которым любой вызов, который индексировал бы договоренность в trav и # 233; s i вызови tambi и # 233; n не определенное поведение. – PaperBirdMaster 04.04.2016, 12:18
  • 2
    Верный. И если ты обращаешь внимание видеть и # 225; s, что не использует n ни для чего... quiz и # 225; s идея состоит в том, чтобы n заменил i, в случае которых tambi и # 233; n habr и # 237; в который подтверждать, если n est и # 225; в ранге v и # 225; lido [0,1], ввиду того, что arB и #250; nicamente у него есть два элемента..., но уже было много полагать. – eferion 04.04.2016, 12:24
  • 3
    дело в том, что уже я не вошел, чтобы оценивать совсем не м и # 225; s..., не зная экс-и # 225; ctamente qu и # 233; ждут от X::f, что нет ничего, что мы могли бы делать из-за того, что ответили на вопрос и анализировали c и # 243; я говорю, что он так s и # 243; это одна p и # 233; rdida времени; с одним s и # 243; беглый взгляд я нашел много неудач, что не в и # 241; adir и # 233; в ответе из-за уже упомянутого. – PaperBirdMaster 04.04.2016, 12:25
  • 4
    Я понимаю тебя верно. Я сконцентрировался на том, чтобы пробовать отвечать на вопрос и препятствовал всему dem и # 225; s, потому что, если не ответ собирался быть слишком пространным – eferion 04.04.2016, 12:27
  • 5
    Цель X:: f состоит в том, чтобы копировать каждый элемент договоренности типа A в договоренность тип B **, string s состоит ключом, с которым я получаю стоимость A, int & n - количество элементов договоренности типа A. Но пока это и #250; nico, что вызывает у меня проблемы, состоит в том, чтобы возвращать договоренность тип B ** для Вашей последующей поездки. Escrib и # 237; этот c и # 243; я говорю, чтобы ограничивать funci и # 243; n, чтобы реализовывать только это задание и туз и # 237; мочь изолировать проблему. – emi 04.04.2016, 23:02

Продолжи, не оставаясь ясным цель, к которой ты стремишься, утилита и ожидания функции X::f даже не структура кода в общем; я попробую давать ответ на какие-то вещи посмотрим мы можем осветлить темные точки.

Цель X:: f состоит в том, чтобы копировать каждый элемент договоренности типа A в договоренность тип B **

Это испытывает недостаток полностью в чувстве. Тип A и тип B** (указатель в указатель в B) это полностью несовместимые, не только из-за того, что - различные типы (A и B) если не, потому что указатели и инстанции не то же самое. Я думаю, что ты делаешь себе неразбериху, или я понимаю тебя плохо.

Договоренность типа A это последовательность инстанций A смежные в памяти, договоренности типа B** это последовательность указателей в указатели в инстанции B, все эти указатели также смежные в памяти.

string s - ключ, с которым я получаю стоимость A

Если ты индексируешь элементы посредством ключа, мы не говорим о договоренности, если бы не ассоциативного контейнера, это могла быть (например) карта; несмотря на твой комментарий, мне не возможно обнаруживать нигде в коде, что ты не имел никакой индексации никакой информации посредством string.

int &n - количество элементов договоренности типа A

Возможно, что он так, но параметр типа снабжает ссылками существо, мне хочется думать о возможности того, чтобы ждут, что это был параметр чтения и написания, итак смоги состоять в том, чтобы он был облегчен n чтобы читать количество элементов договоренности As не, чтобы распределять их... ясно, что является только одним предположением, ничего нет в твоем коде, который помогает ничего не прояснять.

Но пока единственное, что вызывает у меня проблемы, состоит в том, чтобы возвращать договоренность тип B ** для Вашей последующей поездки.

Чтобы начинаться, ты не показываешь, что проблемы у тебя вызывает твое решение..., но в действительности, будь, которые были они - несовершеннолетний твоих проблем, в часть проблем, уже упомянутых из-за eferion, тип B** который ты возвращаешь в X::f это в действительности внутренняя информация о классе X, в частности член X::arB тип которого B*[M] (я упорядочиваю M элементы указателей в B) тогда, когда ты это возвращаешь в X::f ослабей в B** теряя информацию о размере и нарушая начало encapsulamiento, хотя выражение encapsulamiento уже ты это игнорировал, когда публичные члены сделали.

В общем договоренности указателей как B** обычно используют для договоренностей двух размеров или договоренностей “зуб пилы” (договоренности двух размеров с нерегулярным количеством элементов в каждом индексе. Я прихожу к заключению о том, что функция X::f стремись к тому, чтобы преобразовать что-то в договоренность двух размеров типов B, но это продолжать быть только предположением.

Чтобы пробегать договоренность B** (или любая другая договоренность двух размеров) ты должен делать двойной цикл:

for (int x = 0; x < limite_x; ++x)
    for (int y = 0; y < limite_y; ++y)
        std::cout << b[x][y] << ‘\n’;

Но я не могу быть уверен, что это - то, что ты ищешь, так как не остается ясной твоя цель.

-1
ответ дан 24.11.2019, 14:39
  • 1
    Прототип X:: f я сделал это таким, каков я это ped и # 237; an в задании. Проигнорируйте пару и # 225; метры (я был болен в писании их, если он не будет использовать их для вопроса). Aqu и # 237; моя главная проблема состоит в том, что у него не было даже идеи, состоящей в том, что то, что было B ** (указатель в указатель - то и #250; nico, что entend и # 237; a). Сейчас я понимаю, что то, в чем я нуждаюсь, состоит в том, чтобы производить нового B ** начиная с A. Я нуждаюсь в договоренностях p и # 250; blicos, так как у прототипов оставшейся части функций, которые они просят у меня, нет в Вашей паре и # 225; метры договоренность, которую нужно изменять. Я нуждаюсь в том, чтобы сделать ejecucion.modificarAlgo (); каждый раз, когда я хочу ввести информацию в компьютер | удалять какую-то вещь. – emi 05.04.2016, 17:51
  • 2
    #191; И c и # 243; mo осуществляется conversi и # 243; n от A до B? и #191; И c и # 243; mo осуществляется conversi и # 243; n с договоренности A до договоренности указателей в указатели в B? – PaperBirdMaster 05.04.2016, 17:57
  • 3
    B он способен хранить тот же informaci и # 243; n, который A, следовательно возможно копировать. Превращения не необходимы. – emi 06.04.2016, 04:33