Для кода, подобного этому:
Я получаю эту ошибку:
в настоящее время переменная a инициализируется в конструкторе foo .
если я сделаю его статическим, тогда он говорит:
Однако я хочу передать значение a в конструкторе. Каково решение тогда?
В С++, в отличие от (скажем) Java, экземпляр вложенного класса не является неотъемлемо принадлежащим к любому экземпляру охватывающего класса. Таким образом, bar::getA не имеет конкретного экземпляра foo , чей a он может возвращаться. Я предполагаю, что вам нужно что-то вроде:
Но даже для этого вам, возможно, придется внести некоторые изменения, потому что в версиях С++ до С++ 11, в отличие от (опять же, скажем) Java, вложенный класс не имеет специального доступа к его охватывающему классу, t элемент protected a . Это будет зависеть от вашей версии компилятора. (Hat-tip для Ken Wayne VanderLinde, указав, что С++ 11 изменил это.)
В С++ вложенные классы не связаны ни с одним экземпляром внешнего класса. Если вы хотите, чтобы bar имел доступ к нестационарным членам foo , тогда bar должен иметь доступ к экземпляру foo . Может быть, что-то вроде:
В любом случае вам необходимо явно убедиться, что у вас есть доступ к экземпляру foo .
У меня есть два класса, которые я хочу по цепочке (основной -> выполнить -> вычислить). Однако проблема в том, что когда я использую:
Добавление не будет вызвано, даже если компилятор не вернет никакой ошибки. Если я попытаюсь удалить ссылку на
Компилятор возвращает ошибку
Пробовал использовать static до void с тем же результатом, что и с использованием reference.
Решение
У вас есть несколько проблем в вашем коде. Давайте начнем:
Это означает, что вы должны создать экземпляр для расчета или пометить метод как статический. static void addition(double&, double, double);
Так что измени свой класс на
Следующая проблема заключается в том, что в вашем операторе switch вы создаете только указатели на функции
Это никогда не выполняет функцию, а только создает указатель на функцию, который сразу отбрасывается.
Чтобы заставить ваш код работать, рассмотрите этот код (обратите внимание на комментарии в коде, которые объясняют необходимые изменения):
Надеюсь, это поможет понять ваши проблемы.
Другие решения
Для вызова любого метода в классе calc вы должны сначала объявить переменную, а затем вызвать метод, например:
или вы определяете методы как статические функции, в этом случае вызов будет таким
Пишу класс дерева отрезков. У него, конечно, есть приватное поле и публичное.
У дерева отрезков есть операция запроса суммы. Она принимает в качестве одного из аргументов по умолчанию — приватный член класса, обозначающий размеры дерева.
И компилятор ругается на это.
error: invalid use of non-static data member ‘Tree::te’ — на строке объявления переменной в private-поле.
error: from this location — на строке объявления функции sum(), где мы и передаёт аргумент по-умолчанию.