При разрешении “только статические элементы данных интеграла константы могут быть инициализированы в классе” ошибка компиляции

Используйте AVAudioRecorder для записи:

private var audioRecorder: AVAudioRecorder!

После того, как вы объявили аудиорекордер, вы можете написать метод записи:

func startRecording() throws {
        guard let newFileURL = createURLForNewRecord() else {
            throw RecordingServiceError.canNotCreatePath
        }
        do {
            currentFileURL = newFileURL
            audioRecorder = try AVAudioRecorder(url: newFileURL,
                                                settings: [AVFormatIDKey:Int(kAudioFormatMPEG4AAC),
                                                           AVSampleRateKey: 8000,
                                                           AVNumberOfChannelsKey: 1,
                                                           AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue])
            audioRecorder.delegate = self
            audioRecorder.prepareToRecord()
            audioRecorder.record(forDuration: TimeConstants.recordDuration)
        } catch let error {
            print(error)
        }
}

И использовать некоторые вспомогательные методы и структуры:

enum RecordingServiceError: String, Error {
    case canNotCreatePath = "Can not create path for new recording"
}

private func createURLForNewRecord() -> URL? {
        guard let appGroupFolderUrl = FileManager.getAppFolderURL() else {
            return nil
        }

        let fileNamePrefix = DateFormatter.stringFromDate(Date())
        let fullFileName = "Record_" + fileNamePrefix + ".m4a"
        let newRecordFileName = appGroupFolderUrl.appendingPathComponent(fullFileName)
        return newRecordFileName
}

extension FileManager {
    class func getAppFolderURL() -> URL? {
        return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "you app bundle")
    }
}
6
задан j0k 25 September 2012 в 17:48
поделиться

4 ответа

Только начните исправлять ошибки один за другим. Много ошибок просто располагается каскадом от начальных ошибок, таким образом, похоже, что существует много проблем, когда существует только пара. Только запустите с вершины:

1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class

Вы не можете инициализировать участника в определении класса, если это не статично, константа и один из целочисленных типов. Уезжайте"= 5"прочь объявления number. Затем у Вас должно будет быть определение Tester::number за пределами определения класса, как так:

int Tester::number = 5;

Проблема № 2:

1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'

Почти точно, что это говорит (недостающие ошибки точки с запятой могут быть немного неточными в высказывании, где точка с запятой должна быть) - Вам нужна точка с запятой после определения Tester класс.

Зафиксируйте их, и Ваши проблемы компиляции уходят.

Ключевая вещь состоит в том, чтобы попытаться взять ошибки компилятора по одному от вершины. Если Вы получаете больше, чем приблизительно 3 из них, можно, вероятно, просто проигнорировать все после приблизительно 3-го, потому что начальное ошибочное правое дело компиляция к в сорняки (и если они - реальные ошибки, они обнаружатся снова в следующей компиляции так или иначе).

11
ответ дан 9 December 2019 в 20:50
поделиться
  • Ошибка C2864: любой добавляет a const модификатор к Вашему целому числу или перемещение инициализация вне класса (как в class Tester { static int number; }; int Tester::number = 5;). Последний кажется более соответствующим Вашему случаю.
  • Ошибка C2146: Вы пропускаете точку с запятой после объявления class Tester { ... }. Это должно быть class Tester { ... };

Другие ошибки, вероятно, вызываются предыдущей ошибкой. Они должны зафиксировать себя автоматически, когда это фиксируется.

Как примечание стороны, я не думаю, что Вы действительно хотите static модификатор на Вашем участнике. Это кажется более подходящим для поля экземпляра. Вы все еще не можете инициализировать его оперативный, хотя (это не C#), необходимо переместить инициализацию к конструктору. Например:

class Tester {
    int number;
    static int staticNumber; // just to show you how to use a static field

public:
    Tester() : number(5) {}
    ~Tester() {} // I suggest you remove the destructor unless you need it

    int getNumber() { return number; }
    void setNumber(int value) { number = value; }

    static int getStaticNumber() { return staticNumber; }
    static void setStaticNumber(int value) { staticNumber = value; }
};

// initialize static members *outside* the class
int Tester::staticNumber = 5;
1
ответ дан 9 December 2019 в 20:50
поделиться

Согласно этому: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr038.htm

Tester testerObject;
int Tester::number = 5;

Я не положителен, но я думаю, что остальная часть ошибок прибывает из той одной проблемы. Зафиксируйте это и посмотрите, как далеко это получает Вас.

0
ответ дан 9 December 2019 в 20:50
поделиться

ответы уже здесь имеют дело с тем, почему Ваш код не компилирует и как исправить это. однако я заинтригован Вашими комментариями об "экстерне". это очень просто в использовании, когда Вы знаете как. Вы объявляете в одном заголовке extern'ed переменную. и затем Вы инициализируете его в одном файле. любой другой файл может относиться к переменной включением заголовка. например.

header.h:

// ensure the file is only included once
#ifndef _HEADER_H
#define _HEADER_H

extern int foo;

#endif
// end file header.h

header.cpp

#include "header.h"

int foo = 1;

// end file header.cpp

main.cpp

#include "header.h"
#include <stdio.h>

int main(int argc, char** argv)
{
  printf("%d", foo);
  return 0;
}

// end file main.cpp

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

0
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: