Я пытаюсь пройти через структуру «Круг» (в основном бинарное дерево). Каждый круг имеет centerX, centerY, радиус и два листовых узла. Эти листья либо оба будут нулевыми, либо оба не будут нулевыми. Никогда не будет ни одного нуля, ни одного ненулевого.

Я использую перегрузку оператора для вывода круга в выходной поток с использованием формата файла SVG. Ниже приведен соответствующий код:

Circle.h:

#include <set>
#include <iostream>

using namespace std;

class Circle {
 private:
  double centerX, centerY, radius;
  Circle* c1;
  Circle* c2;
  
 public:
  static const int PAGE_DIMENSION = 200;
  static const int DEFAULT_MAX_RADIUS = 15;
  
  Circle( double x, double y, double radius, Circle* r1,  Circle* r2 );
  Circle( double x, double y, double radius );
  Circle();
  
  int isLeaf() const;
  double getCenterX() const;
  double getCenterY() const;
  double area() const;
  double getRadius() const;
  Circle* getFirstSubcircle() const;
  Circle* getSecondSubcircle() const;
  
  bool operator<( Circle& other );
  Circle* operator()( double x_in, double y_in);
  Circle& operator=( Circle& rhs);
  Circle* operator,( Circle& other ); 
  double distance( Circle& rhs );

  // THESE FUNCTIONS ARE NOT CLASS MEMBERS
  // THEY ARE DEFINED OUTSIDE OF THE CLASS
  // BUT REQUIRE ACCESS TO PRIVATE FIELDS
  friend ostream& operator<<(ostream& osInput, Circle& circle);
  friend ostream& operator/(ostream& osInput, Circle& circle);
  friend Circle* reduce( set<Circle*>&  circles);
};

Circle.cpp:

#include <math.h>
#include <time.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <set>
#include <fstream>
#include "circle.h"


using namespace std;

  Circle::Circle( double x, double y, double radius, Circle* r1,  Circle* r2 )
  {
      centerX = x;
      centerY = y;
      this->radius = radius;
      c1 = r1;
      c2 = r2;
  }

  Circle::Circle( double x, double y, double radius )
  {
      centerX = x;
      centerY = y;
      this->radius = radius;
  }

  Circle::Circle()
  {
      srand(time(0));
      int randomX = rand() % (PAGE_DIMENSION + 1);
      int randomY = rand() % (PAGE_DIMENSION + 1);
      int randomRadius = rand() % DEFAULT_MAX_RADIUS + 1;
      centerX = randomX;
      centerY = randomY;
      radius = randomRadius;
  }

  Circle* Circle::getFirstSubcircle() const
  {
      return c1;
  }

  Circle* Circle::getSecondSubcircle() const
  {
      return c2;
  }

  int Circle::isLeaf() const
  {
      if (c1 == NULL && c2 == NULL) {
          return 1;
      }

      return 0;
  }

  ostream& operator/(ostream& osInput, Circle& circle)
  {
      if (circle.isLeaf()) {
          osInput << " <circle cx=\"" << circle.centerX << "\" cy=\"" << circle.centerY <<"\" radius=\"" << circle.radius << "\" style=\"fill:blue;stroke:black;stroke-width:.05;fill-opacity:.1;stroke-opacity:.9\"/>\n";
      }
      else {
          osInput << " <circle cx=\"" << circle.centerX << "\" cy=\"" << circle.centerY <<"\" radius=\"" << circle.radius << "\" style=\"fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5\"/>\n";
          Circle* firstCircle = circle.getFirstSubcircle();
          Circle* secondCircle = circle.getSecondSubcircle();
          osInput / *firstCircle;
          osInput / *secondCircle;
      }
  }

Test.cpp :

#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <stdlib.h>
#include "circle.h"

using namespace std;

int main( int argc, char** argv ) {
    Circle* circ2_1 = new Circle(45, 65, 3);
    Circle* circ2_2 = new Circle(56, 55, 3);
    Circle* circ2 = new Circle(11, 21, 8, circ2_1, circ2_2);
    Circle* circ3 = new Circle(7, 7, 7);
    Circle* circ4 = new Circle(10, 25, 11, circ2, circ3);
    cout / *circ4;
}

Когда я запускаю код, как показано выше, на выходе получаю следующее:

 <circle cx="10" cy="25" radius="11" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
 <circle cx="11" cy="21" radius="8" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
 <circle cx="45" cy="65" radius="3" style="fill:blue;stroke:black;stroke-width:.05;fill-opacity:.1;stroke-opacity:.9"/>
 <circle cx="56" cy="55" radius="3" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>

Следующий результат - это то, что я ожидаю (на основе кода в main):

 <circle cx="10" cy="25" radius="11" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
<circle cx="11" cy="21" radius="8" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
 <circle cx="45" cy="65" radius="3" style="fill:blue;stroke:black;stroke-width:.05;fill-opacity:.1;stroke-opacity:.9"/>
 <circle cx="56" cy="55" radius="3" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
 <circle cx="7" cy="7" radius="7" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>

Если я переключу последние пару строк кода в функции «ostream & operator /» в circle.cpp на следующее:

osInput / *secondCircle;
osInput / *firstCircle;

Результатом будет:

 <circle cx="10" cy="25" radius="11" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>
 <circle cx="7" cy="7" radius="7" style="fill:yellow;stroke:black;stroke-width:.05;fill-opacity:.0;stroke-opacity:.5"/>

Опять же, это не то, чего я ожидал. Проблема, по-видимому, в том, что это только добавление к потоку первого круга, который указан в коде, будь то «firstCircle» или «secondCircle», который появляется первым. Я ошибаюсь, думая, что он должен давать результат, которого я ожидаю? Любые идеи, указывающие мне в правильном направлении, были бы очень признательны, поскольку я перепробовал все, что мог придумать.

0
Wesley Brandt 28 Ноя 2021 в 03:49
Для конструкторов с тремя параметрами Circle вы не инициализируете члены c1 или c2. Это будет неопределенное поведение, когда вы позже попытаетесь разыменовать эти значения.
 – 
1201ProgramAlarm
28 Ноя 2021 в 03:56
Вау, ты был мертв. Это решило мою проблему, и это имеет смысл. Спасибо!
 – 
Wesley Brandt
28 Ноя 2021 в 04:01

2 ответа

Лучший ответ

Для конструкторов с тремя параметрами Circle вы не инициализируете члены c1 или c2. Это будет неопределенное поведение, когда вы позже попытаетесь разыменовать эти значения (вероятно, сбой).

2
1201ProgramAlarm 28 Ноя 2021 в 04:13

Комментарий 1201ProgramAlarm решил проблему.

0
Wesley Brandt 28 Ноя 2021 в 04:03