Ошибка абстрактного класса, см. Объявление "" абстрактно - PullRequest
0 голосов
/ 22 октября 2018

Я получаю эту ошибку, и я не уверен, как ее исправить, #include "stdafx.h"

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Puzzle {
public:
virtual bool action(char [][8], int, int) = 0;
virtual void print_solution(char [][8], int) = 0;
};

class Queen8: public Puzzle {
public:
bool action(char Q[][8], int row, int col) {
    for (int r = 0; r < row; r++) {
        if (Q[r][col] == '1') {
            return false;
        }
    }
    for (int r = row, c = col; r >= 0 && c >= 0; r--, c--) {
        if (Q[r][c] == '1') {
            return false;
        }
    }
    for (int r = row, c = col; r >= 0 && c < 8; r--, c++) {
        if (Q[r][c] == '1') {
            return false;
        }
        else {
            return true;
        }
    }
  }

  void print_solution(char Q[][8], int row) {
    if (row == 8)
    {
        for (int r = 0; r < 8; r++) {
            for (int c = 0; c < 8; c++)
                cout << Q[r][c] << " ";
            cout << endl;
        }
        cout << endl;
        return;
    }
    for (int c = 0; c < 8; c++) {
        if (action(Q, row, c)) {
            Q[row][c] = '1';
            print_solution(Q, row + 1);
            Q[row][c] = '0';
        }
    }
}
};



int main() {
Puzzle Queen8;
char Q[8][8];
for (int r = 0; r < 8; r++) {
    for (int c = 0; c < 8; c++) {
        Q[r][c] = '0';
    }
}
Queen8.print_solution(Q, 0);

}

Точная ошибка:

c: \пользователи \ delta \ onedrive \ Documents \ visual studio 2013 \ projects \ consoleapplication46 \ consoleapplication46 \ consoleapplication46.cpp (60): ошибка C2259: 'Puzzle': невозможно создать экземпляр абстрактного класса

1> из-за следующих членов:

1> 'Головоломка bool :: action (char [] [8], int, int)': абстрактная

1> c: \ users \ delta \ onedrive \ Documents \ visual studio2013 \ projects \ consoleapplication46 \ consoleapplication46 \ consoleapplication46.cpp (9): см. Объявление 'Puzzle :: action'

1> 'void Puzzle :: print_solution (char [] [8], int)':является абстрактным

1> c: \ users \ delta \ onedrive \ Documents \ visual studio 2013 \ projects \ consoleapplication46 \ consoleapplication46 \ consoleapplication46.cpp (10): см. объявление 'Puzzle :: print_solution'

1 Ответ

0 голосов
/ 22 октября 2018

В вашей функции main() вы создаете экземпляр класса Puzzle, а не класса Queen8:

Puzzle Queen8;

Вместо этого следует создать экземпляр Queen8:

Queen8 q;
...
q.print_solution(Q, 0);

Кроме того, вы всегда должны использовать ключевое слово override при переопределении виртуальных функций (C ++ 11 и выше).Это сообщит компилятору о вашем намерении и даст вам гораздо лучшие предупреждения и ошибки в случае, если вы что-то пропустите.Итак, внутри класса Queen8 вы должны иметь:

bool action(char Q[][8], int row, int col) override {
    ...
}

void print_solution(char Q[][8], int row) override {
    ...
}
...